我正在绘制一个单独的hexbin图和json边界文件。hexbin网格与边界文件重叠。我只想显示非洲大陆。我的目标是在非洲大陆内切断或子集hexbin网格**。因此,边界文件外部不应显示网格正方形。是否有方法使用Plotly实现这一点?
import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objs as go
import plotly.figure_factory as ff
import geopandas as gpd
import json
data = pd.DataFrame({
'LAT': [1,5,6,7,5,6,7,5,6,7,5,6,7,12,-40,50],
'LON': [10,10,11,12,10,11,12,10,11,12,10,11,12,-20,40,50],
})
gdf_poly = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres"))
gdf_poly = gdf_poly.drop('name', axis = 1)
Afr_gdf_area = gdf_poly[gdf_poly['continent'] == 'Africa'].reset_index(drop = True)
fig = ff.create_hexbin_mapbox(data_frame=data,
lat="LAT",
lon="LON",
nx_hexagon=25,
opacity=0.4,
labels={"color": "Point Count"},
mapbox_style='carto-positron',
zoom = 1
)
fig.update_layout(mapbox={
"layers": [
{"source": json.loads(Afr_gdf_area.geometry.to_json()),
"below": "traces",
"type": "fill",
"color": "orange",
"opacity" : 0.1,
"line": {"width": 1}
},
],
})
fig.show()
预期输出是切断或剪辑广场以外的非洲满意度,这是在橙子。
1条答案
按热度按时间8aqjt8rx1#
如果你看一下
fig.data[0]
的内部,它是一个Choroplethmapbox
,有几个字段,包括customdata
和geojson
。geojson包含绘制hexbin所需的所有信息,包括每个六边形的coordinates
和唯一的id
。customdata是一个形状为[n_hexbins x 3]
的数组,其中数组的每个元素都包括id和plotly用于确定每个hexbin颜色的数值。要选择指定边界内的hexbins,我们可以从plotly生成的fig.data[0]中的customdata和geojson中提取信息,并创建一个geopandas Dataframe 。然后我们可以创建一个新的geopandas Dataframe ,称为
hexbins_in_afr
,它是hexbins的新gdf和Afr_gdf_area
之间的内部连接(以便我们删除Afr_gdf_area之外的所有hexbins)。在我们从
hexbins_in_afr
和customdata
中提取geojson
信息之后,我们可以在fig.data[0]
中显式设置以下字段:下面是经过必要修改的代码: