如何使用pcolormesh仅绘制分类降水数据中值为0.99的区域
问题描述
- 数据集说明:分类降水数据仅包含两类取值,
-0.99代表无降水,0.99代表有降水 - 绘图需求:使用
pcolormesh仅绘制值为0.99的降水区域 - 问题现象:自定义颜色映射的代码运行后全图被渲染为深粉色,未实现仅绘制降水区的效果
原有错误代码如下:
import matplotlib as mpl from matplotlib import colors import cartopy.crs as ccrs import matplotlib.pyplot as plt proj = ccrs.LambertConformal(central_longitude=cLon, central_latitude=cLat) fig = plt.figure(figsize=(12,12),dpi=100) ax = fig.add_subplot(1,1,1,projection=proj) ax.set_extent ([lonW,lonE,latS,latN]) ptype_colors_fzra = ['deeppink'] cmap_ptype_ext_fzra = mpl.colors.ListedColormap(ptype_colors_fzra) norm_ptype_ext_fzra = mpl.colors.BoundaryNorm([0.98,1],ncolors = len(ptype_colors_fzra)) ax.contourf(lons, lats, cfzra, cmap = cmap_ptype_ext_fzra, norm = norm_ptype_ext_fzra, transform = ccrs.PlateCarree(), zorder = 2)
错误渲染效果:
错误原因
原有代码定义的BoundaryNorm仅设置了[0.98, 1]的映射区间,所有小于0.98的数值(即占绝大多数的-0.99无降水值)会被映射到colormap的越界低值区间,单颜色colormap的越界填充色默认就是列表内的深粉色,最终导致全区域被错误填色。
推荐实现方式
方法1:numpy掩膜过滤非目标值(最简便)
将所有不等于0.99的数值设为掩膜缺测值,matplotlib/cartopy绘图时会自动跳过缺测值不做渲染,仅保留降水区填色,示例代码:
import numpy as np import matplotlib as mpl import cartopy.crs as ccrs import matplotlib.pyplot as plt proj = ccrs.LambertConformal(central_longitude=cLon, central_latitude=cLat) fig = plt.figure(figsize=(12,12), dpi=100) ax = fig.add_subplot(1,1,1, projection=proj) ax.set_extent([lonW, lonE, latS, latN]) # 掩膜掉所有不等于0.99的无降水区域 cfzra_precip = np.ma.masked_not_equal(cfzra, 0.99) # 单颜色colormap即可,不需要复杂norm cmap_precip = mpl.colors.ListedColormap(['deeppink']) ax.pcolormesh(lons, lats, cfzra_precip, cmap=cmap_precip, transform=ccrs.PlateCarree(), zorder=2)
方法2:自定义colormap设置透明值
构造包含透明色的两色colormap,让-0.99对应的颜色完全透明,仅0.99显示深粉色,需要注意norm边界要覆盖全部数据取值范围:
import matplotlib as mpl from matplotlib import colors import cartopy.crs as ccrs import matplotlib.pyplot as plt proj = ccrs.LambertConformal(central_longitude=cLon, central_latitude=cLat) fig = plt.figure(figsize=(12,12), dpi=100) ax = fig.add_subplot(1,1,1, projection=proj) ax.set_extent([lonW, lonE, latS, latN]) # 第一个颜色对应-0.99无降水,设为完全透明;第二个对应0.99降水为深粉色 cmap_precip = mpl.colors.ListedColormap(['#00000000', 'deeppink']) # 边界覆盖-1到1的范围,把-0.99分到第一档,0.99分到第二档 norm_precip = mpl.colors.BoundaryNorm([-1, 0, 1], ncolors=2) ax.pcolormesh(lons, lats, cfzra, cmap=cmap_precip, norm=norm_precip, transform=ccrs.PlateCarree(), zorder=2)
两种方法效果一致,掩膜法逻辑更简单,不需要手动调整颜色边界,适合仅绘制单类值的场景。
内容的提问来源于stack exchange,提问作者Wx_Trader
相关产品推荐
相关产品推荐

