基于Folium库地理数据可视化绘制留言板数据全国数量分布
想实现动态地图展示留言板数据量的视觉效果。
·
背景
想实现动态地图展示留言板数据量的视觉效果。
基本原理
- 城市地图基础:使用 folium.Map() 创建了一个基础的地图,并设置了初始的中心点为北京的经纬度。
- 利用
folium叠加数据,用了高德地图的api瓦片图层 - 叠加数据
实现代码
import folium
import pandas as pd
from folium.plugins import MarkerCluster
# 数据加载到 pandas DataFrame
data = {
'区域': ['河南省', '广东省', '山东省', '河北省', '陕西省', '甘肃省', '四川省', '江苏省', '安徽省', '辽宁省', '山西省',
'北京市', '云南省', '浙江省', '湖北省', '吉林省', '内蒙古自治区', '广西壮族自治区', '天津市', '黑龙江省',
'福建省', '重庆市', '贵州省', '江西省', '新疆维吾尔自治区', '湖南省', '上海市', '海南省', '宁夏回族自治区',
'青海省', '西藏自治区', '新疆生产建设兵团', '澳门特别行政区', '香港特别行政区'],
'2023年': [40820, 31782, 30893, 27178, 27060, 25571, 25492, 25031, 24651, 23895, 19100, 18985, 17142, 13570, 12415,
11411, 11205, 11144, 10947, 10542, 8666, 8018, 7060, 6915, 6124, 6018, 4982, 4721, 4688, 2741, 2192, 141, 3, 2],
'2024年': [57347, 54486, 43321, 41798, 31529, 32813, 24862, 30919, 33657, 32280, 22215, 18030, 15469, 13543, 12278,
12305, 9317, 12505, 9845, 11710, 9478, 8077, 7143, 8220, 5530, 7395, 4847, 4221, 4092, 2705, 1788, 104, 3, 2]
}
df = pd.DataFrame(data)
# 省会城市的大致经纬度
city_coordinates = {
'河南省': [34.7466, 113.6254], # 郑州
'广东省': [23.1291, 113.2644], # 广州
'山东省': [36.6512, 117.1201], # 济南
'河北省': [38.0428, 114.5149], # 石家庄
'陕西省': [34.2583, 108.9280], # 西安
'甘肃省': [36.0611, 103.8343], # 兰州
'四川省': [30.5728, 104.0668], # 成都
'江苏省': [32.0603, 118.7969], # 南京
'安徽省': [31.8206, 117.2272], # 合肥
'辽宁省': [41.8057, 123.4315], # 沈阳
'山西省': [37.8696, 112.5489], # 太原
'北京市': [39.9042, 116.4074], # 北京
'云南省': [25.0446, 102.7103], # 昆明
'浙江省': [30.2741, 120.1551], # 杭州
'湖北省': [30.5928, 114.3055], # 武汉
'吉林省': [43.8868, 125.3245], # 长春
'内蒙古自治区': [40.8173, 111.7652], # 呼和浩特
'广西壮族自治区': [22.8196, 108.3113], # 南宁
'天津市': [39.0851, 117.2009], # 天津
'黑龙江省': [45.7423, 126.6367], # 哈尔滨
'福建省': [26.0793, 119.2965], # 福州
'重庆市': [29.5630, 106.5516], # 重庆
'贵州省': [26.6476, 106.6302], # 贵阳
'江西省': [28.6747, 115.9329], # 南昌
'新疆维吾尔自治区': [43.8256, 87.6168], # 乌鲁木齐
'湖南省': [28.2282, 112.9388], # 长沙
'上海市': [31.2304, 121.4737], # 上海
'海南省': [20.0319, 110.3312], # 海口
'宁夏回族自治区': [38.4714, 106.2782], # 银川
'青海省': [36.6171, 101.7789], # 西宁
'西藏自治区': [29.6525, 91.1721], # 拉萨
'新疆生产建设兵团': [42.7598, 85.2405], # 基地位置
'澳门特别行政区': [22.1987, 113.5439], # 澳门
'香港特别行政区': [22.3193, 114.1694] # 香港
}
# 根据 value 映射颜色和字体大小
def get_marker_style(value):
# 字体大小的映射范围
font_size = 4 + (value / 1000) # 根据 value 映射字体大小
# 根据 value 映射颜色
if value > 20000:
color = 'red'
elif value > 10000:
color = 'orange'
else:
color = 'green'
return color, font_size
import folium
from folium import plugins
# 创建基础地图函数,带有直接显示数字的标记
def create_map(year, data):
city_map = folium.Map(location=[35.8617, 104.1954], zoom_start=5)
# 添加百度地图瓦片图层
folium.TileLayer(
tiles="https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}",
attr="百度地图",
name="百度地图",
overlay=True,
control=True
).add_to(city_map)
# 设置MarkerCluster不在所有缩放级别下都聚集
marker_cluster = MarkerCluster(
disableClusteringAtZoom=5 # 设定当地图缩放达到10时,停止聚集
).add_to(city_map)
for index, row in data.iterrows():
coordinates = city_coordinates.get(row['区域'])
if coordinates:
value = row[f'{year}年'] # 获取指定年份的数据
color, font_size = get_marker_style(value) # 获取动态的颜色和字体大小
folium.Marker(
location=coordinates,
popup=None,
tooltip=f"{row['区域']}: {value}",
icon=folium.DivIcon(
html=f'<div style="font-size: {font_size}px; color: {color}; font-weight: bold;">{value}</div>'
)
).add_to(marker_cluster)
city_map.save(f'city_message_board_{year}_no_clustering.html')
print(f"地图已保存为 'city_message_board_{year}_no_clustering.html'。")
# 分别创建2023年和2024年的地图
create_map(2023, df)
create_map(2024, df)
效果

更多推荐
所有评论(0)