news 2026/4/29 15:43:39

手把手教你用Python+Matplotlib绘制专业级专题地图(附代码与数据)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用Python+Matplotlib绘制专业级专题地图(附代码与数据)

Python+Matplotlib实战:5种专题地图绘制技巧与设计原则

当你需要展示中国各省GDP差异、全球人口密度分布或是某城市商业网点热度时,静态表格远不如一张精心设计的地图直观。作为数据可视化领域的瑞士军刀,Python的Matplotlib库配合Geopandas等地理数据处理工具,能让你轻松实现从基础统计图到专业级专题地图的跨越。不同于商业GIS软件的复杂操作,这套开源方案让地图制作流程完全可编程、可复现且高度定制化。

1. 环境配置与基础地图绘制

在开始绘制专题地图前,需要搭建一个稳定的地理数据处理环境。推荐使用conda创建专属Python环境,这能有效避免库版本冲突:

conda create -n geo_env python=3.9 conda activate geo_env conda install -c conda-forge geopandas matplotlib descartes pip install contextily mapclassify

Geopandas是地理数据处理的基石,它扩展了pandas的DataFrame结构,使其能够存储几何对象。中国省级行政区划数据可以从国家基础地理信息中心获取,这里我们使用简化版的GeoJSON:

import geopandas as gpd import matplotlib.pyplot as plt # 加载中国省级行政区划数据 china = gpd.read_file('china_provinces.geojson') base = china.plot(edgecolor='black', facecolor='none', figsize=(12,10)) plt.title('中国省级行政区划底图') plt.axis('off')

常见问题排查

  • 如果遇到CRS(坐标参考系统)警告,需明确指定投影方式:
    china = china.to_crs('EPSG:4326') # WGS84经纬度坐标
  • 图形显示为空白时,检查数据范围是否合理:
    print(china.total_bounds) # 应输出[73.5, 18.1, 135.1, 53.6]类似范围

2. 质底法:经济差异可视化实践

质底法适合展示连续分布的面状现象差异,如各省GDP、人均收入等指标。关键在于色彩方案的选择——既要体现数值梯度,又要保证色差可辨识。

色彩设计黄金法则

  1. 顺序型数据使用单色渐变(如蓝→白→红)
  2. 分类数据使用定性色板(如Set3、Paired)
  3. 发散型数据使用双色渐变(如蓝→白→红)

以下示例展示2022年中国各省GDP排名:

import numpy as np from matplotlib.colors import LinearSegmentedColormap # 模拟GDP数据(单位:万亿元) china['GDP'] = np.random.uniform(0.5, 12, len(china)) china['GDP_rank'] = china['GDP'].rank(ascending=False) # 创建自定义色带 colors = ["#2b83ba", "#abdda4", "#ffffbf", "#fdae61", "#d7191c"] cmap = LinearSegmentedColormap.from_list("gdp_cmap", colors) fig, ax = plt.subplots(1, 1, figsize=(14, 12)) china.plot(column='GDP', cmap=cmap, legend=True, ax=ax, legend_kwds={'label': "GDP(万亿元)", 'orientation': "horizontal"}) ax.set_title('2022年中国各省GDP分布(质底法)', fontsize=16)

进阶技巧

  • 使用mapclassify模块优化分类区间:
    import mapclassify as mc scheme = mc.Quantiles(china['GDP'], k=5) china.plot(column='GDP', scheme=scheme)
  • 添加省界描边增强可读性:
    china.boundary.plot(ax=ax, linewidth=0.5, edgecolor='gray')

3. 点数法:人口密度精准表达

点数法通过单位面积内点子的数量反映分布密度,特别适合人口、设施点位等离散分布现象。核心难点在于确定合适的点值和点尺寸。

参数设计经验值

地图比例尺建议点值(人/点)点直径(mm)
1:500万50万-100万0.3-0.5
1:1000万100万-500万0.4-0.6
1:4000万500万-1000万0.5-0.8

实现代码示例:

from matplotlib.patches import Circle from matplotlib.collections import PatchCollection def create_dots(gdf, value_col, dot_value, dot_size=0.4): patches = [] for _, row in gdf.iterrows(): density = row[value_col] / row.geometry.area n_dots = int(density * row.geometry.area / dot_value) # 在面域内随机布点 minx, miny, maxx, maxy = row.geometry.bounds for _ in range(n_dots): x = np.random.uniform(minx, maxx) y = np.random.uniform(miny, maxy) if row.geometry.contains(gpd.points_from_xy([x], [y])[0]): patches.append(Circle((x,y), dot_size)) return PatchCollection(patches, color='#e34a33', alpha=0.6) # 模拟人口数据(单位:万人) china['population'] = np.random.randint(500, 12000, len(china)) fig, ax = plt.subplots(figsize=(14, 12)) china.plot(ax=ax, color='#f0f0f0', edgecolor='#636363') dots = create_dots(china, 'population', dot_value=500000) # 每点代表50万人 ax.add_collection(dots) ax.set_title('中国人口密度分布(点数法)', fontsize=16)

性能优化

  • 大数据量时使用shapely.strtree加速空间查询
  • 考虑使用datashader库处理超大规模点数据

4. 等值线法:地形与气象数据呈现

等值线法适用于连续变化的面状现象,如高程、气温、降水量等。Matplotlib的tricontourf函数可以直接处理离散点数据,无需规则网格。

DEM数据处理流程:

import rasterio from rasterio.plot import show from scipy.interpolate import griddata # 读取DEM数据 with rasterio.open('dem.tif') as src: dem = src.read(1) transform = src.transform # 生成网格坐标 rows, cols = dem.shape x, y = np.meshgrid(np.arange(cols), np.arange(rows)) x = transform * (x, y) y = transform * (x, y) # 创建等值线图 fig, ax = plt.subplots(figsize=(12, 10)) levels = np.linspace(dem.min(), dem.max(), 15) contour = ax.tricontourf(x.flatten(), y.flatten(), dem.flatten(), levels=levels, cmap='terrain') fig.colorbar(contour, label='高程(米)') ax.set_title('数字高程模型(等值线法)', fontsize=16)

专业增强技巧

  • 添加晕渲效果提升立体感:
    from matplotlib.colors import LightSource ls = LightSource(azdeg=315, altdeg=45) shaded = ls.hillshade(dem, vert_exag=2) ax.imshow(shaded, cmap='gray', alpha=0.3)
  • 使用cartopy库添加专业地图元素:
    import cartopy.crs as ccrs ax = plt.axes(projection=ccrs.PlateCarree()) ax.coastlines()

5. 符号系统设计与视觉优化

专业地图的成败往往取决于细节处理。以下关键要素需要特别注意:

视觉变量组合原则

变量类型适用场景示例
尺寸数量差异圆形符号大小表示城市规模
色相质量差异不同颜色表示产业类型
明度等级差异颜色深浅表示污染程度
纹理次级分类填充图案区分行政区类型

高级符号化示例:

from matplotlib.lines import Line2D # 创建复合符号 fig, ax = plt.subplots(figsize=(14, 12)) china.plot(ax=ax, edgecolor='gray', facecolor='#f5f5f5') # 模拟城市数据 cities = gpd.read_file('major_cities.geojson') sizes = np.interp(cities['population'], (cities['population'].min(), cities['population'].max()), (30, 300)) scatter = ax.scatter(cities.geometry.x, cities.geometry.y, s=sizes, c=cities['GDP_growth'], cmap='RdYlGn', edgecolors='black', alpha=0.7, zorder=5) # 添加图例 legend_elements = [ Line2D([0], [0], marker='o', color='w', label='<2%', markerfacecolor='#d7191c', markersize=10), Line2D([0], [0], marker='o', color='w', label='2-4%', markerfacecolor='#fdae61', markersize=10), Line2D([0], [0], marker='o', color='w', label='>4%', markerfacecolor='#1a9641', markersize=10) ] ax.legend(handles=legend_elements, title='GDP增长率') plt.colorbar(scatter, label='GDP增长率(%)') ax.set_title('中国主要城市经济指标复合符号系统', fontsize=16)

印刷级输出设置

plt.savefig('output.pdf', dpi=600, bbox_inches='tight', facecolor='white', edgecolor='none', metadata={'Creator': 'Python Matplotlib', 'Title': '专题地图示例'})
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 15:42:27

财务人的SAP入门:看懂中日会计科目差异,避免报表合并踩坑

中日会计准则差异下的SAP财务合并实战指南 当中国母公司财务总监第一次打开日本子公司的SAP系统报表时&#xff0c;屏幕上那些似曾相识却又截然不同的会计科目名称让他皱起了眉头。"売掛金"对应的是哪个科目&#xff1f;"のれん"又该映射到中国报表的哪个项…

作者头像 李华
网站建设 2026/4/29 15:42:25

Rust的PhantomData:标记类型的所有权与生命期

Rust的PhantomData&#xff1a;标记类型的所有权与生命期 Rust以其严格的所有权和生命期系统闻名&#xff0c;但某些场景下编译器无法自动推断类型的所有权或生命期关系。这时&#xff0c;PhantomData便成为解决这类问题的关键工具。PhantomData是一种零大小的标记类型&#x…

作者头像 李华
网站建设 2026/4/29 15:41:00

LK1802 国兴顺 双路驱动芯片 两路达林顿晶体管阵列

给大家介绍一款很实用的驱动芯片 ——LK1802。它是一款两路大电流达林顿管阵列&#xff0c;简单说就是把两个独立的达林顿管做在了一颗 SOT23-6 的小封装里&#xff0c;用起来很方便。它的每一路输出&#xff0c;都自带了续流二极管&#xff0c;所以像继电器、步进电机这类感性…

作者头像 李华
网站建设 2026/4/29 15:40:02

生成引擎优化(GEO)在提升内容创作效率与强化用户体验中的作用分析

生成引擎优化&#xff08;GEO&#xff09;在内容创作中的应用不仅限于提升效率&#xff0c;还全面提升用户体验。GEO通过数据分析帮助创作者明确用户需求&#xff0c;从而设计出更具针对性的内容&#xff0c;吸引用户的注意。此外&#xff0c;优化后的内容结构增强了信息的可读…

作者头像 李华
网站建设 2026/4/29 15:30:25

RTX 4090D 24G镜像效果展示:CogVideoX视频生成模型长时序连贯性实测

RTX 4090D 24G镜像效果展示&#xff1a;CogVideoX视频生成模型长时序连贯性实测 1. 开箱即用的高性能视频生成环境 当拿到这台搭载RTX 4090D 24GB显卡的工作站时&#xff0c;我第一反应就是测试它在视频生成任务上的表现。这个预装了PyTorch 2.8和CUDA 12.4的深度学习镜像&am…

作者头像 李华
网站建设 2026/4/29 15:29:47

保姆级教程:用ENVI+ArcMap搞定NPP/VIIRS夜间灯光数据,5步提取城市建成区

从夜间灯光到城市轮廓&#xff1a;ENVIArcMap高效提取建成区的实战指南 当夜幕降临&#xff0c;人造光源勾勒出人类活动的边界&#xff0c;这些闪烁的光点成为研究城市化进程的珍贵数据源。NPP/VIIRS夜间灯光数据以其高灵敏度和全球覆盖特性&#xff0c;正在城市规划、经济评估…

作者头像 李华