You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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基础实现(无省份边界):现有Dash实现效果
  • matplotlib端shapefile叠加散点目标效果:matplotlib参考效果

补充说明

如果你的点位数据量极大(过万级),可以把散点图层替换为go.Scattergl提升渲染性能;如果需要给省份加填色、点击高亮等交互,直接修改go.Choropleth的填充色参数即可,不需要调整整体代码结构。

内容的提问来源于stack exchange,提问作者Sina Kian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:36:15