如何在Plotly Choropleth Mapbox中复用区域坐标添加标注
解决Plotly Choropleth Mapbox自动提取GeoJSON坐标添加标注的问题
核心思路是从GeoJSON的省份几何数据中自动计算标注位置(比如质心),再和你的业务数据关联,避免手动输入坐标。以下是具体实现步骤:
1. 提取GeoJSON中省份的中心坐标
用shapely库解析GeoJSON的几何图形,计算每个省份的质心(或内部代表点),这是最适合标注的位置:
import pandas as pd from shapely.geometry import shape # 假设你的GeoJSON数据存在变量geojson中 centroid_data = [] for feature in geojson["features"]: # 解析几何图形 geom = shape(feature["geometry"]) # 计算质心坐标(如果质心位置不合适,换成geom.representative_point()) centroid = geom.centroid # 存储省份名称和坐标,注意这里的properties字段要和你的GeoJSON对应 centroid_data.append({ "state": feature["properties"]["state"], "lat": centroid.y, "lon": centroid.x }) # 转成DataFrame方便后续合并 centroid_df = pd.DataFrame(centroid_data)
2. 合并业务数据与坐标数据
把你包含省份和价格的业务数据(假设是df)和上面的坐标数据按省份名称合并:
# 确保df和centroid_df的state列完全匹配(大小写、拼写一致) merged_df = pd.merge(df, centroid_df, on="state")
3. 生成地图并添加自动定位的标注
用合并后的数据初始化地图,再通过add_scattermapbox添加标注:
import plotly.express as px import plotly.graph_objects as go # 初始化Choropleth Mapbox fig = px.choropleth_mapbox( merged_df, geojson=geojson, locations="state", featureidkey="properties.state", # 对应GeoJSON里的省份属性名 color="price", mapbox_style="carto-positron", zoom=3, center={"lat": -38.4161, "lon": -63.6167}, # 阿根廷中心坐标 opacity=0.5 ) # 添加标注,自动使用GeoJSON提取的坐标 fig.add_scattermapbox( lat=merged_df["lat"], lon=merged_df["lon"], text=merged_df["price"].apply(lambda x: f"${x}"), # 格式化价格显示 mode="text", textfont=dict(size=12, color="#000000"), textposition="bottom center", # 让标注显示在区域下方,符合你的需求 showlegend=False ) # 调整布局去掉边距 fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0}) fig.show()
注意事项
- 务必保证GeoJSON中省份的属性名(比如
feature["properties"]["state"])和你的业务数据df里的state列完全一致,否则合并会丢失数据。 - 如果某些省份的质心落在区域外(比如狭长或分散的省份),把
geom.centroid换成geom.representative_point(),这个方法会返回多边形内部的点,位置更合理。 - 可以通过
textfont和textposition参数调整标注的样式和位置,满足你的显示需求。
内容的提问来源于stack exchange,提问作者Martin Bouhier
相关产品推荐
相关产品推荐

