如何在佐治亚州专属地图上实现带悬停注释的点位可视化?
如何在佐治亚州专属地图上实现带悬停注释的点位可视化?
我来帮你解决这个问题!你遇到的情况其实很常见——要么是Plotly里没法聚焦到单个州的地图,要么是Matplotlib里悬停注释的实现没找对方法。下面给你两种可行的方案,挑你顺手的来:
方案一:用Plotly实现佐治亚州专属地图+悬停(改动最小)
你原来的Plotly代码已经能实现悬停,但用了scope='usa'导致显示整个美国地图。其实不用换库,只要调整地图的布局参数,就能聚焦到佐治亚州,同时保留原生的悬停交互。
具体代码如下:
import plotly.express as px import pandas as pd # 读取你的县数据 Counties = pd.read_excel('/content/uscounties.xlsx') data = Counties[Counties['state_name'] == 'Georgia'] # 计算佐治亚州的中心坐标,用来定位地图 ga_center_lat = data['lat'].mean() ga_center_lon = data['lng'].mean() # 创建散点地理图,先不设置scope fig = px.scatter_geo( data, lat='lat', lon='lng', color='county', hover_name='county', title='Georgia Counties' ) # 调整地图布局,聚焦到佐治亚州 fig.update_geo( center=dict(lat=ga_center_lat, lon=ga_center_lon), # 把地图中心定位到佐治亚州 projection_scale=8, # 缩放级别,数值越大地图显示越近,可根据需求调整 showcountries=False, # 隐藏其他国家边界 showstates=True, # 显示州级边界 scope='north america' # 限定地图范围在北美,避免显示无关区域 ) fig.show()
这样改完之后,地图会自动聚焦在佐治亚州,悬停注释和原来一样正常工作,完全保留Plotly的交互优势,对你原来的代码改动也很小。
方案二:修复Matplotlib的悬停注释问题
你之前用Matplotlib的annotate是把所有县名静态显示在图上,这不是真正的悬停效果。Matplotlib本身没有原生的悬停功能,我们可以用mplcursors库来实现这个需求,步骤如下:
- 先安装
mplcursors(如果还没装的话):
pip install mplcursors
- 调整后的代码:
import matplotlib.pyplot as plt import mplcursors import geopandas as gpd # 读取佐治亚州的底图shapefile和你的点位数据 # 替换成你实际的文件路径 shapefile = gpd.read_file('path/to/georgia_counties_shapefile.shp') # 如果你的点位数据是从Excel来的,可以转成GeoDataFrame: # data = pd.read_excel('/content/uscounties.xlsx') # geo_gc1 = gpd.GeoDataFrame(data[data['state_name'] == 'Georgia'], # geometry=gpd.points_from_xy(data.lng, data.lat)) geo_gc1 = gpd.read_file('path/to/your_points_data.shp') fig, ax = plt.subplots(figsize=(15, 15)) # 绘制佐治亚州底图 shapefile.plot(ax=ax, alpha=0.4, color='green') # 绘制点位,保存返回的对象以便绑定悬停事件 points_layer = geo_gc1.plot( ax=ax, markersize=20, color='blue', marker='o' ) # 使用mplcursors添加悬停注释 cursor = mplcursors.cursor(points_layer, hover=True) @cursor.connect("add") def on_hover(sel): # 获取当前悬停点位对应的县名 selected_index = sel.target.index county_name = geo_gc1.iloc[selected_index]['county'] # 设置悬停显示的内容 sel.annotation.set_text(county_name) # 调整注释的样式,让它更清晰 sel.annotation.get_bbox_patch().set(fc="white", alpha=0.8) plt.legend(prop={'size': 10}) plt.show()
这个代码里,mplcursors会监听鼠标悬停在点位上的动作,只在悬停时显示对应的县名,完美实现你想要的悬停注释效果。
备注:内容来源于stack exchange,提问作者C Sicily
相关产品推荐
相关产品推荐

