十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python 自动化实现地图可视化

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)
返回列表