Cartopy模块快速入门:从安装到地图绘制实战
1. 为什么选择Cartopy绘制地图第一次接触地理数据可视化时我尝试过Basemap、GeoPandas等多种工具最终发现Cartopy才是Python3时代的地图绘制利器。这个由英国气象局开发的库完美继承了Matplotlib的绘图基因又融合了专业的地理空间处理能力。最让我惊喜的是它用几行代码就能生成出版级地图连经纬度网格、海岸线标注这些繁琐细节都自动搞定。相比BasemapCartopy有三大优势首先是原生支持Python3不用担心环境兼容问题其次是依赖现代地理库比如PROJ.4和Shapely投影转换精度更高最重要的是API设计非常人性化我教过的编程新手基本30分钟就能画出第一张地图。去年处理台风轨迹数据时Cartopy的等距投影功能帮我省去了大量手动计算坐标的时间。提示如果你正在学习气象、地理或环境科学Cartopy绝对是数据可视化的必修课。它的地图基底功能可以让你专注在数据分析上而不是反复调试绘图参数。2. 零基础安装指南2.1 两种安装方案对比我强烈推荐通过Anaconda安装特别是Windows用户。去年帮学弟调试环境时发现用pip直接安装经常卡在PROJ.4的编译环节。而conda-forge渠道预编译了所有依赖项实测在macOS/Windows/Linux都能一键搞定conda install -c conda-forge cartopy如果坚持用pip需要先确保系统有GEOS和PROJ.4开发库。以Ubuntu为例这些依赖项要提前装好sudo apt-get install libgeos-dev proj-bin libproj-dev pip install cartopy2.2 验证安装是否成功打开Python终端运行这个测试脚本如果看到带海岸线的地图窗口弹出说明一切就绪import matplotlib.pyplot as plt import cartopy.crs as ccrs fig plt.figure(figsize(10,5)) ax fig.add_subplot(111, projectionccrs.PlateCarree()) ax.coastlines() plt.show()常见踩坑点有些同学反馈导入时报错PROJ: proj_create_from_database这通常是PROJ库路径问题。可以尝试设置环境变量export PROJ_LIB/path/to/anaconda3/share/proj3. 绘制你的第一张专业地图3.1 核心四步法以绘制中国区域降水分布图为例Cartopy的工作流非常清晰选择投影方式PlateCarree是最常用的等经纬度投影创建画布和坐标系注意projection参数要前后一致添加地理要素海岸线、国界线、网格线等叠加数据图层用pcolormesh或contourf绘制气象数据import numpy as np import cartopy.feature as cfeature # 生成模拟数据 lons np.linspace(75, 135, 100) lats np.linspace(15, 55, 100) data np.random.rand(100, 100) * 50 # 绘制地图 proj ccrs.PlateCarree() fig plt.figure(figsize(12,8)) ax fig.add_subplot(111, projectionproj) # 添加地理要素 ax.add_feature(cfeature.COASTLINE.with_scale(50m)) ax.add_feature(cfeature.BORDERS, linestyle:) ax.gridlines(draw_labelsTrue) # 绘制数据 contour ax.contourf(lons, lats, data, transformproj) plt.colorbar(contour, label降水量 (mm))3.2 进阶技巧自定义区域和样式想让地图更专业这几个参数我每次必调set_extent聚焦到特定区域比如ax.set_extent([100, 125, 20, 45])锁定中国东部add_feature添加河流、湖泊等自然要素分辨率可选10m/50m/110mstock_img加载NASA的蓝色大理石底图ax.stock_img()最近给研究所做报告时发现这个样式组合既美观又专业plt.style.use(seaborn) # 设置全局样式 ax.add_feature(cfeature.LAND.with_scale(50m), facecolor#f0f0e0) ax.add_feature(cfeature.OCEAN.with_scale(50m), facecolor#a0c8f0) ax.add_feature(cfeature.LAKES.with_scale(50m), alpha0.5)4. 常见问题解决方案4.1 中文显示乱码问题这是Matplotlib的老难题了Cartopy继承了这个痛点。我的终级解决方案是plt.rcParams[font.sans-serif] [SimHei] # Windows plt.rcParams[axes.unicode_minus] False如果是Linux/macOS系统需要先下载中文字体如文泉驿然后指定字体路径import matplotlib.font_manager as fm font_path /usr/share/fonts/wenquanyi.ttf prop fm.FontProperties(fnamefont_path) ax.set_title(中国区域地图, fontpropertiesprop)4.2 矢量数据叠加技巧当需要在地图上叠加散点或箭头时务必设置transform参数。去年分析台风路径时就栽过跟头# 正确做法声明数据坐标系统 ax.scatter(lons, lats, colorred, transformccrs.PlateCarree()) # 错误做法会导致数据错位 ax.scatter(lons, lats, colorred)对于Shapefile文件推荐使用cartopy.io.shapereaderfrom cartopy.io import shapereader shp_path shapereader.natural_earth(resolution10m, categorycultural, nameadmin_0_countries) reader shapereader.Reader(shp_path) countries reader.records() for country in countries: if country.attributes[NAME] China: ax.add_geometries(country.geometry, ccrs.PlateCarree(), facecolornone, edgecolorblack)