Python 自动化实现地图可视化
Python 自动化实现地图可视化Python生态系统中有多个专门用于地图可视化的库每个库都有其独特的特点和适用场景。以下是几个最常用的库及其核心功能pyecharts基于百度ECharts的Python接口支持高度可定制的交互式地图特别适合中国地区的可视化需求。它能够生成包含省、市、县多级行政区划的精细地图并支持热力图、散点图、迁徙图等多种可视化形式。folium基于Leaflet.js构建可以创建交互式网页地图支持标记点、热力图、路径绘制等功能。folium的优势在于其简洁的API和丰富的插件系统能够轻松实现复杂的地图效果。geopandas结合了pandas的数据处理能力和地理空间分析功能特别适合处理Shapefile等地理空间数据格式。它可以与matplotlib无缝集成创建静态但高度专业的地图。Cartopy专注于地图投影和地理空间数据可视化的库适合科学计算和气象领域的需求。它支持多种地图投影方式并能与matplotlib深度集成。Basemap已逐渐被Cartopy取代Matplotlib的扩展用于绘制二维地图支持多种投影和地理特征绘制。在实际应用中我们可以根据需求选择合适的库或组合使用多个库。例如pyecharts适合快速创建交互式业务报表folium适合构建网页集成的地图应用而geopandas和Cartopy则更适合科学研究和专业地理分析。1、 环境准备与安装要使用pyecharts进行地图可视化首先需要安装必要的库pip install pyecharts pip install echarts-countries-pypkg # 世界地图 pip install echarts-china-provinces-pypkg # 中国省级地图 pip install echarts-china-cities-pypkg # 中国市级地图 pip install echarts-china-counties-pypkg # 中国区县级地图 pip install echarts-china-misc-pypkg # 中国区域地图 pip install folium2、 pyecharts是目前Python生态中最流行的地图可视化工具之一内置了中国各级行政区划地图无需额外配置即可使用。提供三种主要的地图类型Map行政区域地图、Geo地理坐标地图和Bmap百度地图。首先来看最基本的Map类型的使用。2.1 基础地图绘制假设有一份中国各省市人口数据文件population_2023.xlsx可以使用以下代码创建可视化地图import pandas as pd from pyecharts.charts import Map from pyecharts import options as opts # 读取数据 data pd.read_excel(population_2023.xlsx) province list(data[省份]) population list(data[人口(万人)]) data_pair [list(z) for z in zip(province, population)] # 创建地图 map_chart ( Map(init_optsopts.InitOpts(width1000px, height600px)) .add(Population, data_pair, china) .set_global_opts( title_optsopts.TitleOpts(title2023年各省人口分布图 单位:万人), visualmap_optsopts.VisualMapOpts(max_110000, is_piecewiseTrue) ) ) map_chart.render(china_population_map.html)这段代码会生成一个交互式的中国地图各省份根据population大小显示不同颜色颜色深浅表示数值大小。2.2 高级定制与主题切换pyecharts提供了丰富的定制选项可以调整地图的视觉效果以满足不同需求。分段型视觉映射将连续的数据分成几个区间每个区间显示不同颜色。visualmap_optsopts.VisualMapOpts( min_1000, max_110000, range_text[人口(万人)颜色区间:, ], is_piecewiseTrue, # 分段显示 pos_topmiddle, pos_leftleft, orientvertical, split_number10 # 分成10个区间 )主题切换pyecharts内置了十余种主题可以轻松改变地图的整体风格。from pyecharts.globals import ThemeType map_chart Map(init_optsopts.InitOpts( width1000px, height600px, themeThemeType.DARK # 使用暗黑主题 ))pyecharts支持的主题包括WHITE默认、LIGHT、DARK、CHALK、ESSOS、INFOGRAPHIC、MACARONS、PURPLE_PASSION、ROMA、ROMANTIC、SHINE、VINTAGE、WALDEN等。2.3 Geo地图与涟漪图效果除了常规的行政区域地图pyecharts还提供Geo类型可以基于经纬度坐标绘制地理要素并实现特殊的视觉效果如涟漪图。from pyecharts.charts import Geo from pyecharts.globals import ChartType geo_chart ( Geo(init_optsopts.InitOpts(width1000px, height600px)) .add_schema(maptypechina) .add( GDP, data_pair, type_ChartType.EFFECT_SCATTER, # 涟漪图效果 symbol_size10, large_threshold110000, ) .set_series_opts(label_optsopts.LabelOpts(is_showFalse)) .set_global_opts( visualmap_optsopts.VisualMapOpts(max_110000), title_optsopts.TitleOpts(title2019年各省GDP涟漪图) ) ) geo_chart.render(geo_gdp_map.html)涟漪图效果会在地图上的数据点位置产生波纹状的动画效果非常适合突出显示特定位置。2.4 百度地图集成pyecharts还支持与百度地图的集成Bmap这需要先到百度地图开放平台申请AK访问密钥。from pyecharts.charts import BMap bmap ( BMap(init_optsopts.InitOpts(width1000px, height600px)) .add_schema( baidu_akYOUR_BAIDU_MAP_AK, # 替换为你的百度地图AK center[120.13066322374, 30.240018034923], # 地图中心点 zoom5 # 缩放级别 ) .add( GDP, data_pair, type_heatmap, # 热力图类型 label_optsopts.LabelOpts(formatter{b}) ) .set_global_opts( title_optsopts.TitleOpts(title2019年各省GDP热力图), visualmap_optsopts.VisualMapOpts(max_110000) ) ) bmap.render(bmap_gdp_heatmap.html)百度地图集成提供了真实的地理底图适合需要精确定位或与真实地理要素结合的场合。3. folium是一个基于Leaflet.js的Python库可以创建高度交互式的网页地图支持标记、热力图、路径绘制等多种功能。3.1 基础地图创建Folium创建地图非常简单只需几行代码import folium # 创建地图对象设置中心点和缩放级别 m folium.Map(location[39.9042, 116.4074], zoom_start12) # 北京坐标 # 保存为HTML文件 m.save(my_map.html)这段代码会创建一个以北京为中心的地图缩放级别为12适合查看城市级别的细节。3.2 添加标记点地图上的标记点是最基本也是最常用的元素之一# 添加普通标记 folium.Marker( location[39.9042, 116.4074], popup北京市, iconfolium.Icon(colorred, iconinfo-sign) ).add_to(m) # 添加圆形标记 folium.Circle( location[39.9163, 116.3903], radius500, # 单位是米 colorblue, fillTrue, fill_opacity0.6, popup故宫博物院 ).add_to(m) m.save(map_with_markers.html)popup参数设置了点击标记时显示的文本icon可以改变标记的样式和颜色。圆形标记适合表示区域范围。3.3 绘制线条与多边形对于路线或区域的可视化可以使用线条和多边形# 创建新地图 m2 folium.Map(location[39.9042, 116.4074], zoom_start12) # 绘制线条如步行路线 route [ [39.9042, 116.4074], # 起点 [39.9163, 116.3903], # 故宫 [39.9999, 116.3264] # 颐和园 ] folium.PolyLine( route, colorgreen, weight5, opacity0.8, tooltip北京一日游路线 ).add_to(m2) # 绘制多边形如景区范围 park_area [ [39.9999, 116.3264], [40.0050, 116.3300], [40.0080, 116.3200], [39.9999, 116.3264] # 最后一点要与第一点相同形成闭合 ] folium.Polygon( park_area, colororange, fillTrue, fill_coloryellow, fill_opacity0.4, popup颐和园区域 ).add_to(m2) m2.save(map_with_lines.html)注意绘制多边形时最后一个点必须与第一个点相同才能形成闭合区域。3.4 热力图实现热力图非常适合展示数据的密集程度比如人口分布、犯罪热点等from folium.plugins import HeatMap import numpy as np # 生成一些随机数据点纬度经度强度 data ( np.random.normal(size(100, 3)) * np.array([[0.1, 0.1, 1]]) np.array([[39.90, 116.40, 1]]) ).tolist() m3 folium.Map(location[39.9042, 116.4074], zoom_start12) HeatMap(data, radius15).add_to(m3) # radius控制热力点的半径大小 m3.save(heatmap.html)热力图的数据格式是[纬度, 经度, 权重]权重表示热点的强度值越大颜色越深。3.5 图层控制与多底图切换folium支持添加多个图层并让用户自由切换m4 folium.Map(location[39.9042, 116.4074], zoom_start12) # 添加两个不同的底图图层 folium.TileLayer(OpenStreetMap).add_to(m4) # 默认街道图 folium.TileLayer(Stamen Terrain).add_to(m4) # 地形图 # 添加标记 folium.Marker([39.9042, 116.4074], popup天安门).add_to(m4) folium.Marker([39.9163, 116.3903], popup故宫).add_to(m4) # 添加图层控制 folium.LayerControl().add_to(m4) m4.save(map_with_layers.html)这样用户就可以在地图右下角切换不同的底图样式了。3.6 标记聚合(MarkerCluster)当有大量标记时使用标记聚合可以提高性能from folium.plugins import MarkerCluster m folium.Map(location[39.9042, 116.4074]) # 创建MarkerCluster对象 marker_cluster MarkerCluster().add_to(m) # 添加多个标记到MarkerCluster folium.Marker([39.9042, -74.0060], popup纽约市).add_to(marker_cluster) folium.Marker([40.730610, -73.935242], popup布鲁克林).add_to(marker_cluster) folium.Marker([40.650002, -73.949997], popup皇后区).add_to(marker_cluster) m.save(cluster_map.html)当地图缩放时标记会自动聚合提高可读性和性能。3.7 结合Pandas进行数据可视化folium可以很好地与Pandas配合实现基于数据的地图可视化import pandas as pd # 假设我们有一个包含城市数据的DataFrame data { city: [北京, 上海, 广州, 深圳], lat: [39.9042, 31.2304, 23.1291, 22.5431], lon: [116.4074, 121.4737, 113.2644, 114.0579], population: [2171, 2424, 1530, 1303] # 单位万 } df pd.DataFrame(data) m5 folium.Map(location[35, 110], zoom_start5) # 为每个城市添加标记大小与人口成正比 for _, row in df.iterrows(): folium.CircleMarker( location[row[lat], row[lon]], radiusrow[population]/300, # 按比例缩放 popupf{row[city]}人口{row[population]}万, colorblue, fillTrue ).add_to(m5) m5.save(china_cities.html)这个例子展示了如何将数据分析与地图可视化结合圆圈大小直观反映了城市人口规模。3.8 在Web应用中使用Folium地图可以轻松嵌入到Flask等Web框架中from flask import Flask import folium app Flask(__name__) app.route(/) def show_map(): m folium.Map(location[39.9042, 116.4074]) # 地图对象直接转HTML return m._repr_html_() if __name__ __main__: app.run(debugTrue)在HTML模板中可以使用iframe嵌入地图iframe stylewidth:100%; height:500px; src{{ url_for(show_map) }}/iframe4、geopandas与Cartopy专业地图绘制对于需要更专业地理空间分析的应用场景geopandas和Cartopy提供了更强大的功能。4.1 geopandas基础应用geopandas结合了pandas的数据处理能力和地理空间分析功能可以处理Shapefile等地理空间数据格式。安装geopandaspip install geopandas使用geopandas读取地理空间数据并绘制基础地图import geopandas as gpd # 读取地理空间数据Shapefile格式 gdf gpd.read_file(path_to_shapefile.shp) # 创建基础地图 m folium.Map( location[gdf.geometry.y.mean(), gdf.geometry.x.mean()], zoom_start12 ) # 添加地理数据 folium.GeoJson(gdf).add_to(m) # 保存地图 m.save(geopandas_map.html)geopandas特别适合处理行政区划边界、土地利用类型等面状地理数据。4.2 Cartopy地图投影与专业可视化Cartopy是一个专注于地图投影和地理空间数据可视化的库特别适合科学计算和气象领域的需求。安装Cartopypip install cartopy使用Cartopy创建带有专业投影的世界地图import cartopy.crs as ccrs import matplotlib.pyplot as plt # 创建图形和坐标轴指定投影类型 fig plt.figure(figsize(10, 5)) ax fig.add_subplot(1, 1, 1, projectionccrs.PlateCarree()) # 添加海岸线和国家边界 ax.add_feature(ccrs.cfeature.COASTLINE) ax.add_feature(ccrs.cfeature.BORDERS, linestyle:) # 添加底图 ax.stock_img() plt.show()Cartopy支持多种地图投影如PlateCarree等距圆柱投影、Mercator墨卡托投影、Orthographic正射投影等。4.3 结合Cartopy和matplotlib绘制专业地图Cartopy与matplotlib深度集成可以创建高度定制化的专业地图import cartopy.feature as cfeature # 创建图形和坐标轴使用兰伯特投影 ax fig.add_subplot(1, 1, 1, projectionccrs.LambertConformal()) # 添加地理特征 ax.add_feature(cfeature.LAND) ax.add_feature(cfeature.OCEAN) ax.add_feature(cfeature.COASTLINE) ax.add_feature(cfeature.BORDERS, linestyle:) ax.add_feature(cfeature.LAKES, alpha0.5) ax.add_feature(cfeature.RIVERS) # 设置地图范围中国区域 ax.set_extent([70, 140, 15, 55], crsccrs.PlateCarree()) # 添加网格线 ax.gridlines() plt.title(专业地图示例) plt.show()这种组合特别适合需要精确控制地图要素和投影的科学可视化需求。实际应用案例1. 城市景点分布可视化import pandas as pd import folium from folium import plugins # 读取景点数据 data pd.read_csv(poi_scenic_spot.csv, encodingutf-8) # 创建地图 plotmap folium.Map(location[data[lat].mean(), data[lon].mean()], zoom_start12, control_scaleTrue) # 添加标记聚合 marker_cluster plugins.MarkerCluster().add_to(plotmap) for index, row in data.iterrows(): folium.Marker( [row[lat], row[lon]], popuprow[name] ).add_to(marker_cluster) plotmap.save(scenic_spots.html)2. 车流量可视化import folium # 示例数据经度, 纬度, 区域名称, 车流量值 data [ [116.4, 39.9, 区域A, 50], [116.41, 39.91, 区域B, 30], [116.42, 39.92, 区域C, 70] ] m folium.Map(location[39.9, 116.4], zoom_start10) # 在地图上添加散点图图层 for lon, lat, name, value in data: folium.CircleMarker( [lat, lon], radiusvalue * 2, # 散点大小与车流量成正比 popupf{name}: {value}, # 显示悬浮框信息 fillTrue, fill_color#3186cc, fill_opacity0.5, colorgray, ).add_to(m) m.save(car_flow_map.html)3. 全国销售数据可视化假设我们有一份全国各城市的销售数据可以使用pyecharts创建交互式销售分布图from pyecharts.charts import Map from pyecharts import options as opts sales_data [ (北京, 356), (上海, 412), (广州, 278), (深圳, 385), (成都, 192), (重庆, 156), (武汉, 231), (杭州, 298) ] map_chart ( Map() .add(销售额, sales_data, china) .set_global_opts( title_optsopts.TitleOpts(title全国销售分布图), visualmap_optsopts.VisualMapOpts( max_500, is_piecewiseTrue, pieces[ {min: 300, label: 300-500, color: #c23531}, {min: 200, max: 300, label: 200-300, color: #dd6b66}, {min: 100, max: 200, label: 100-200, color: #f1c47b}, {max: 100, label: 0-100, color: #f8e0a1} ] ) ) ) map_chart.render(sales_map.html)4. 城市房价热力图使用folium创建城市房价热力图import folium from folium.plugins import HeatMap import pandas as pd import numpy as np # 生成模拟数据 np.random.seed(42) lat 39.9042 np.random.normal(0, 0.1, 100) lon 116.4074 np.random.normal(0, 0.1, 100) price np.random.randint(30000, 150000, 100) data np.column_stack([lat, lon, price]) # 创建热力图 m folium.Map(location[39.9042, 116.4074], zoom_start12) HeatMap(data, radius15, gradient{0.4: blue, 0.6: lime, 1: red}).add_to(m) m.save(house_price_heatmap.html)5. 动态时间轴地图pyecharts的时间轴功能可以展示数据随时间的变化from pyecharts.charts import Timeline, Map from pyecharts import options as opts import random # 模拟不同年份的数据 def generate_data(year): provinces [北京, 上海, 广东, 江苏, 浙江, 山东, 河南] return [(province, random.randint(50, 300)) for province in provinces] # 创建时间轴 timeline Timeline() # 为每个年份创建地图 for year in range(2018, 2024): data generate_data(year) map_chart ( Map() .add(f{year}年销售额, data, china) .set_global_opts( title_optsopts.TitleOpts(titlef{year}年全国销售分布), visualmap_optsopts.VisualMapOpts(max_300) ) ) timeline.add(map_chart, f{year}年) # 配置时间轴播放选项 timeline.add_schema( play_interval1000, # 播放间隔1秒 is_auto_playTrue, # 自动播放 is_loop_playTrue # 循环播放 ) timeline.render(animated_sales_map.html)

相关新闻

AI大模型与数学·第50课 级数刷题集训7:级数全模块综合复盘(44-49课全套汇总)

AI大模型与数学·第50课 级数刷题集训7:级数全模块综合复盘(44-49课全套汇总)

本课定位 本课是7天级数集训收官总复习,串联第44~49课全部核心知识点:级数基础定义、正项级数四大判敛、交错级数与绝对/条件收敛、幂级数收敛域、泰勒展开与余项误差。 全部知识点绑定AI大模型真实工程场景:正则化、权重衰减、梯…

2026/11/13 7:53:07 阅读更多 →
AI大模型与数学·第52课傅里叶级数基础2:任意周期T展开、复数形式傅里叶级数——扩散模型复频域噪声分解核心工具

AI大模型与数学·第52课傅里叶级数基础2:任意周期T展开、复数形式傅里叶级数——扩散模型复频域噪声分解核心工具

本课定位 第51课我们完整学习了周期为2\pi的标准傅里叶级数,仅适配周期恰好等于2\pi的信号。 但现实AI工程里,时序、音频、图像、振动数据周期千差万别:音频采样周期、24小时时序、设备振动周期都不是2\pi,因此本节课首先推广任意…

2026/10/29 23:50:52 阅读更多 →
AI大模型与数学·第53课 傅里叶级数基础3:奇偶函数简化、半周期延拓——对称图像、时序信号快速分解

AI大模型与数学·第53课 傅里叶级数基础3:奇偶函数简化、半周期延拓——对称图像、时序信号快速分解

本课定位 第51、52课我们掌握了标准2π周期、任意周期T的三角/复数傅里叶级数完整计算方法,但完整三重积分计算量大、步骤繁琐。 现实AI数据存在大量对称信号: 图像:左右对称、上下对称的人物、建筑、图形;时序:对称振…

2026/10/24 7:35:54 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/14 5:13:29 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/14 5:13:29 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/14 5:13:29 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/14 2:41:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/14 5:13:29 阅读更多 →

日新闻

周新闻

月新闻