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

如何在佐治亚州专属地图上实现带悬停注释的点位可视化?

如何在佐治亚州专属地图上实现带悬停注释的点位可视化?

我来帮你解决这个问题!你遇到的情况其实很常见——要么是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库来实现这个需求,步骤如下:

  1. 先安装mplcursors(如果还没装的话):
pip install mplcursors
  1. 调整后的代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:50:27