如何在Folium气泡地图内显示数值?支持Seaborn静态方案
解决方案
一、Folium交互式气泡地图(添加数值标签)
Folium的Circle组件本身不支持直接在气泡内部添加文字,我们可以通过**叠加Marker组件+自定义DivIcon**的方式实现数值显示。修改后的完整代码如下:
import folium import pandas as pd # 创建基础地图 m = folium.Map(location=[20, 0], tiles="OpenStreetMap", zoom_start=2) # 准备数据 data = pd.DataFrame({ 'lon': [-58, 2, 145, 30.32, -4.03, -73.57, 36.82, -38.5], 'lat': [-34, 49, -38, 59.93, 5.33, 45.52, -1.29, -12.97], 'name': ['Buenos Aires', 'Paris', 'melbourne', 'St Petersbourg', 'Abidjan', 'Montreal', 'Nairobi', 'Salvador'], 'value': [10, 12, 40, 70, 23, 43, 100, 43] }) for idx, row in data.iterrows(): # 添加气泡圆 folium.Circle( location=[row['lat'], row['lon']], popup=f"{row['name']}: {row['value']}", # 优化弹窗,同时显示名称和数值 radius=float(row['value']) * 20000, color='crimson', fill=True, fill_color='crimson', fill_opacity=0.7 # 调整透明度,避免遮挡文字标签 ).add_to(m) # 添加气泡中心的数值标签 folium.Marker( location=[row['lat'], row['lon']], icon=folium.DivIcon( html=f'<div style="font-size: 14px; font-weight: bold; color: white; text-align: center;">{row["value"]}</div>' ) ).add_to(m) # 保存地图 m.save('bubble_folium_with_value.html')
关键修改说明
- 用
data.iterrows()替代索引循环,代码更简洁易读 - 优化弹窗内容,同时展示城市名称和电池容量数值
- 调整气泡透明度,让中心数值标签更清晰
- 通过
DivIcon自定义HTML样式的文字标签,字体颜色、大小可按需调整
二、Seaborn静态气泡图方案
如果需要静态图片,可使用Seaborn结合Matplotlib实现,直接在气泡旁标注数值:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 准备数据 data = pd.DataFrame({ 'lon': [-58, 2, 145, 30.32, -4.03, -73.57, 36.82, -38.5], 'lat': [-34, 49, -38, 59.93, 5.33, 45.52, -1.29, -12.97], 'name': ['Buenos Aires', 'Paris', 'melbourne', 'St Petersbourg', 'Abidjan', 'Montreal', 'Nairobi', 'Salvador'], 'value': [10, 12, 40, 70, 23, 43, 100, 43] }) # 设置绘图风格 sns.set_style("whitegrid") plt.figure(figsize=(12, 8)) # 绘制气泡图 scatter = sns.scatterplot( data=data, x='lon', y='lat', size='value', sizes=(200, 2000), # 控制气泡大小范围,避免数值差距过大导致尺寸失衡 color='crimson', alpha=0.7 ) # 为每个气泡标注数值 for idx, row in data.iterrows(): plt.annotate( f"{row['value']}", (row['lon'], row['lat']), textcoords="offset points", xytext=(0, 10), # 调整标签偏移量,避免遮挡气泡 ha='center', fontweight='bold' ) # 设置坐标轴标签和标题 plt.xlabel('经度') plt.ylabel('纬度') plt.title('全球城市电池存储容量气泡图') plt.legend(title='电池容量', bbox_to_anchor=(1.05, 1), loc='upper left') # 保存并显示图片 plt.tight_layout() plt.savefig('bubble_seaborn.png', dpi=300) plt.show()
方案说明
- 通过
sizes参数控制气泡大小范围,避免极端数值导致的视觉失衡 - 用
plt.annotate在气泡上方标注数值,位置可通过偏移量灵活调整 - 生成的静态图片可直接用于报告、文档等场景
内容的提问来源于stack exchange,提问作者Zeryab Hassan Kiani
相关产品推荐
相关产品推荐

