# Python气象绘图教程（十五）—Cartopy_5

A、仿制的高温图

```olon=np.linspace(108,111,90)
olat=np.linspace(29,32,90)
olon,olat=np.meshgrid(olon,olat)
func=Rbf(lon,lat,danger,function='linear')
danger_new=func(olon,olat)
colorlevel=[0,60,80,100]#危险等级
colordict=['white','orange','red']#颜色列表
danger_map=mcolors.ListedColormap(colordict)#产生颜色映射
norm=mcolors.BoundaryNorm(colorlevel,danger_map.N)#生成索引
ax.contourf(olon,olat,danger_new,levels=colorlevel,cmap=danger_map,norm=norm)#填色图
ax.set_title('地质灾害风险（sample data）',fontsize=12)
danger = mpatches.Rectangle((0, 0), 1, 1, facecolor="red")
low_danger = mpatches.Rectangle((0, 0), 1, 1, facecolor="orange")
labels = ['泥石流高风险','内涝积水风险']
ax.legend([danger, low_danger], labels,fontsize=7,frameon=False,title='图例',
loc='lower left', bbox_to_anchor=(-0.01, 0), fancybox=False)```

B、降水量图的仿制

```filename=r'C:\Users\lenovo\Desktop\ex1.xlsx'
lon=df['lon']#经度
lat=df['lat']#纬度
olon=np.linspace(108,111,90)
olat=np.linspace(29,32,90)
olon,olat=np.meshgrid(olon,olat)
rain=df['rain_new']
func=Rbf(lon,lat,rain,function='linear')
rain_new=func(olon,olat)
colorlevel=[0.1,10.0,25.0,50.0,100.0,250.0,500.0]#雨量等级
colordict=['#A6F28F','#3DBA3D','#61BBFF','#0000FF','#FA00FA','#800040']#颜色列表
rain_map=mcolors.ListedColormap(colordict)#产生颜色映射
norm=mcolors.BoundaryNorm(colorlevel,rain_map.N)#生成索引
cs= ax.contourf(olon,olat,rain_new,levels=colorlevel,cmap=rain_map,norm=norm)
############添加图例#######################
larger1 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#A6F28F")
larger2 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#3DBA3D")
larger3 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#61BBFF")
larger4 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#0000FF")
larger5 = mpatches.Rectangle((0, 0), 1, 1, facecolor="#FA00FA")
labels = ['0~10','10~25','25~50','50~100','100~250']
ax.legend([larger1,larger2,larger3,larger4,larger5], labels,fontsize=12,frameon=False,title='图例（mm）',
loc='lower left', bbox_to_anchor=(-0.01, -0.03), fancybox=False)```

` 'AxesSubplot' object has no attribute 'add_feature'`

crs还控制着数据绘图与边界的裁剪，比如set_extent(crs=ccrs.PlateCarree()) ，就使裁剪的方式按照PlateCarree()的方式进行边界的裁剪，一个经典的案例即兰勃脱下的使用extent进行裁剪，那么将会在地图中出现范围之外的地图：

```ax=fig.add_subplot(1,1,1,projection=ccrs.LambertConformal(central_longitude=110, central_latitude=35))
ax.contourf(lon, lat, temp,levels=np.arange(-40,40),cmap='RdBu_r')```

`ax.contourf(lon, lat, temp,levels=np.arange(-40,40),cmap='RdBu_r',transform=ccrs.PlateCarree())`

transform=PlateCarree()的意思是，这个数据原来是PlateCarree()投影下的，转化为主图的格式后（即LambertConformal），再绘制等值线。

LambertConformal

PlateCarree

transform=PlateCarree

LambertConformal

Mercator

transform=Mercator

PlateCarree

Mercator

transform=Mercator

cartopy官网实例有一个Custom Boundary Shape，通过该例子可以裁剪边框形状。现在尝试裁剪东亚地区的兰勃脱投影。

```import numpy as np
from matplotlib.path import Path
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeat
vertices = [(65, 10), (65, 60), (145, 60), (145, 10), (65, 10)]#五个点，但是首尾是一样的，以连接为封闭的四边形
boundary = Path(vertices)#边界形状
fig=plt.figure(figsize=(5,5),dpi=500)
ax=plt.axes([0,0,1,1],projection=ccrs.LambertConformal(central_longitude=110, central_latitude=35))
ax.set_boundary(boundary, transform=ccrs.PlateCarree())#裁剪边界
ax.set_extent([65,145,0,60])#裁剪地图范围```

```latmin = 10
latmax = 60
lonmin = 70
lonmax = 140
lats = np.linspace(latmax, latmin, latmax - latmin + 1)
lons = np.linspace(lonmin, lonmax, lonmax - lonmin + 1)
vertices = [(lon, latmin) for lon in range(lonmin, lonmax + 1, 1)] + \
[(lon, latmax) for lon in range(lonmax, lonmin - 1, -1)]
boundary = mpath.Path(vertices)
ax.set_boundary(boundary, transform=ccrs.PlateCarree())
ax.set_extent(extent)```

`ax.contourf(data_lon,data_lat,temp,levels=np.arange(-40,40),cmap='Spectral_r',transform=ccrs.PlateCarree())`

0 条评论

• ### Python气象绘图教程（十六）—Cartopy_6

本节提要：使用cartopy进行市县的色块填色、模仿geopandas绘制颜色图

• ### Python-matplotlib 学术散点图完善

上期的推文Python-matplotlib 学术型散点图绘制 推出后，很多小伙伴比较喜欢

• ### Python高效批量绘图方法

在数值预报后处理中经常需要批量出图，而基于matplotlib的图形渲染速度较慢，而提高出图的速度通常可通过两个方面来解决：

• ### 详解 MNIST 数据集

MNIST 数据集已经是一个被"嚼烂"了的数据集, 很多教程都会对它"下手", 几乎成为一个 "典范". 不过有些人可能对它还不是很了解, 下面来介绍一下.

• ### Python-EEG工具库MNE中文教程(10)-信号空间投影SSP数学原理

projector(投影)（简称proj），也称为信号空间投影（SSP），定义了应用于空间上的EEG或MEG数据的线性操作。

• ### 用NW.js构建跨平台桌面应用(1)-入门案例

NW.js 基于 Chromium 和 Node.js，从而可以在桌面app中使用浏览器开发技术并直接调用 Node.js 资源，甚至将一个web应用打包到本地...

• ### PIKOCUBE：带 LED、陀螺仪，WiFi 控制的可编程骰子

今天给大家带来一个非常好玩的项目，带有 54 颗 LED、陀螺仪，支持 WiFi 控制的可编程骰子。

• ### 数据运营实战（三）：用数据说话，从埋点开始

埋点是 App 数据运营中很重要的一个环节。之前我们讨论过用户分群的方式、漏斗转化的改进，但所有 App 数据的来源是数据采集，很多时候就是 App 的埋点。

• ### 如何在 Windows 10 中移除 Internet Explorer 浏览器 如何通过控制面板删除 Internet Explorer 浏览器通过 PowerShell 删

现在 Internet Explorer （IE）已经过时了，可以通过控制面板移除这个古老但是依然是一个伟大的浏览器

• ### 微信、公网播放摄像机视频方案

之前一直都是 描述easynvr的各种功能、应用场景。也介绍了几种可以将easynvr接入公网的方案。