Plotly中如何叠加shapefile绘制带散点的意大利省界地图
Plotly 叠加Shapefile与散点绘制意大利省份标注地图方案
完全可以实现,不需要依赖Plotly内置的低精度底图,直接加载你本地的shapefile即可,渲染精度和你matplotlib端的效果一致,同时保留Plotly的交互能力,完美适配Dash仪表盘场景,具体实现步骤如下:
- 第一步:格式转换
Plotly原生不直接读取shapefile格式,用geopandas1行代码即可转成Plotly兼容的GeoJSON格式:
import geopandas as gpd # 替换为你本地的意大利省份shapefile路径 province_gdf = gpd.read_file("italy_province_boundary.shp") # 输出Plotly可直接调用的GeoJSON对象 italy_province_geojson = province_gdf.__geo_interface__
- 第二步:绘制省份边界底图
用go.Choropleth加载转换后的GeoJSON,将填充色设为全透明,仅保留边界线即可,不需要额外绘制线要素:
import plotly.graph_objects as go fig = go.Figure() # 添加省份边界图层 fig.add_trace(go.Choropleth( geojson=italy_province_geojson, locations=province_gdf.index, z=province_gdf.index, marker_line_color="#333333", # 自定义边界线颜色 marker_line_width=0.8, # 自定义边界线粗细 showscale=False, # 隐藏不需要的色阶条 # 全透明填充,仅展示边界 colorscale=[[0, "rgba(0,0,0,0)"], [1, "rgba(0,0,0,0)"]] ))
- 第三步:叠加点位散点图层
直接在同一画布上添加你的散点标注即可,最后锁定地图投影和显示范围,避免显示全球底图:
# 替换为你自己的点位经纬度数据集 fig.add_trace(go.Scattergeo( lon=point_data["longitude"], lat=point_data["latitude"], mode="markers", marker=dict(size=5, color="#d62728"), name="标注点位", # 可自定义悬停显示的点位信息 hovertext=point_data["point_name"] )) # 调整地图显示参数 fig.update_geos( fitbounds="locations", # 自动缩放到意大利省份边界范围 visible=False, # 隐藏Plotly自带的低精度默认底图 projection_type="mercator" # 选择和你matplotlib端一致的投影即可 ) # 去掉画布多余边距 fig.update_layout(margin=dict(l=0, r=0, t=0, b=0))
- 适配Dash的方法
直接将上述生成的fig对象传入Dash的dcc.Graph(figure=fig)组件即可,支持缩放、悬停、点选等原生交互,渲染清晰度不低于静态matplotlib效果。
效果参考对照:
- 现有Dash基础实现(无省份边界):
- matplotlib端shapefile叠加散点目标效果:
补充说明
如果你的点位数据量极大(过万级),可以把散点图层替换为go.Scattergl提升渲染性能;如果需要给省份加填色、点击高亮等交互,直接修改go.Choropleth的填充色参数即可,不需要调整整体代码结构。
内容的提问来源于stack exchange,提问作者Sina Kian
相关产品推荐
相关产品推荐



