如何将DataFrame地理数据映射到美国地图绘制大小随值变化的静态图
静态美国地图点位绘制方案
不需要依赖geoviews+bokeh的交互式渲染栈,使用matplotlib+cartopy即可直接生成静态快照图片,点位大小可直接绑定DataFrame的val列数值,全程无交互组件依赖。
前置依赖安装
执行以下命令安装需要的库:
pip install pandas matplotlib cartopy
完整实现代码
import pandas as pd import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature # 你的原始数据集 df = pd.DataFrame({ 'city': ['New-York', 'Chicago', 'Los-Angeles'], 'longitude': [-74.006015, -87.624421, -118.242766], 'latitude': [40.712728, 41.875562, 34.053691], 'val': [10, 15, 8] }) # 初始化画布,采用适配美国本土的兰伯特等角投影 fig = plt.figure(figsize=(10, 6)) ax = fig.add_subplot(1, 1, 1, projection=ccrs.LambertConformal()) # 设置地图显示经纬度范围,覆盖美国本土 ax.set_extent([-125, -66, 24, 50], crs=ccrs.PlateCarree()) # 加载底图要素 ax.add_feature(cfeature.LAND, facecolor='#f0f0f0') ax.add_feature(cfeature.COASTLINE, linewidth=0.8) ax.add_feature(cfeature.STATES, linewidth=0.5, edgecolor='#888888') ax.add_feature(cfeature.BORDERS, linewidth=0.8) # 绘制散点,点位大小与val列值正相关 scatter = ax.scatter( x=df['longitude'], y=df['latitude'], s=df['val'] * 10, # 10为缩放系数,可根据显示效果调整 c='#e74c3c', alpha=0.7, transform=ccrs.PlateCarree(), zorder=5 ) # 可选:添加城市名标注 for _, row in df.iterrows(): ax.text( x=row['longitude'] + 0.8, y=row['latitude'], s=row['city'], transform=ccrs.PlateCarree(), fontsize=9 ) # 添加点位大小对应图例 for val in [5, 10, 15]: ax.scatter([], [], c='#e74c3c', alpha=0.7, s=val*10, label=str(val)) ax.legend(title='val值', loc='lower right', framealpha=0.8) # 导出300DPI高清静态图片,也可直接调用plt.show()预览 plt.savefig('us_city_points.png', dpi=300, bbox_inches='tight') plt.close()
自定义调整说明
- 点位大小:如果显示的点过大或过小,直接修改
s=df['val'] * 10中的乘数即可,数值越大点尺寸越大 - 地图范围:如果需要展示阿拉斯加、夏威夷区域,调整
ax.set_extent()内的经纬度边界参数即可 - 样式修改:可直接修改点的颜色、透明度、底图填充色、边界线粗细等参数,适配自己的出图需求
- 输出格式:
plt.savefig()支持导出png、jpg、pdf、svg等多种格式,修改文件名后缀即可
注:第一次运行cartopy时会自动下载公开的地理边界数据,等待数秒即可正常出图。
内容的提问来源于stack exchange,提问作者user12314164
相关产品推荐
相关产品推荐

