我正在绘制一个单独的 hexbin 图和 json 边界文件。不过,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()
Intended output is to cut-off or clip squares outside the African continent, which is in orange.
很遗憾,Plotly 目前不支持对六边形分箱图进行原生裁剪或剪切以适应地理边界。Plotly 中的六边形分箱图是在网格系统上生成的,而地理边界需要基于矢量的裁剪操作。
建议的解决方案:
- 使用地理空间库进行预处理:
-
使用
geopandas
或shapely
等库,你可以将你的数据点与非洲大陆的多边形进行空间连接。 - 从你的 DataFrame 中过滤掉落在非洲大陆多边形外的点。
-
使用过滤后的 DataFrame 创建六边形分箱图。
-
使用其他绘图库:
-
考虑使用专门针对地理空间数据的库,例如
GeoPandas
、Cartopy
或geoplot
。这些库通常提供更好的矢量操作和裁剪支持。
代码示例(使用 geopandas 进行预处理):
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],
})
# 创建数据点的 GeoDataFrame
gdf_points = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data.LON, data.LAT))
# 从 geopandas 加载非洲大陆多边形
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
africa = world[world.continent == 'Africa']
# 将数据点与非洲大陆多边形进行空间连接
gdf_clipped = gpd.sjoin(gdf_points, africa, how='inner', op='intersects')
# 创建使用裁剪数据的六边形分箱图
fig = ff.create_hexbin_mapbox(data_frame=gdf_clipped,
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(africa.geometry.to_json()),
"below": "traces",
"type": "fill",
"color": "orange",
"opacity": 0.1,
"line": {"width": 1}
},
],
})
fig.show()
这段代码首先使用
geopandas
将你的数据点与非洲大陆多边形进行空间连接。然后,它使用
sjoin()
函数过滤掉落在非洲大陆多边形外的点。最后,它使用过滤后的数据创建六边形分箱图。
请记住,这些建议可能需要根据你的具体需求和数据集进行调整。
标签:python,json,plotly,geojson,geopandas From: 75925357