在Cartopy地图中为缺失数据指定非透明颜色

5

我在使用matplotlib的pcolormesh制作地图时遇到了一个问题,即如何为缺失值指定颜色。我想让所有的"nan"值变成灰色,而不是白色/透明色。为此,我尝试使用matplotlib colormaps的set_bad方法,但这似乎破坏了Cartopy。该问题会触发Cartopy的UserWarning,但我不知道解决方法。

以下是一个没有nan值的示例,但显示了问题:

import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import matplotlib as mpl
import cartopy
import sys
print(f"PYTHON: {sys.version}")  # PYTHON: 3.8.1 | packaged by conda-forge | (default, Jan 29 2020, 15:06:10) [Clang 9.0.1 ]
print(f" xarray {xr.__version__}")  # xarray 0.14.1
print(f" numpy {np.__version__}")  # numpy 1.17.3
print(f" matplotlib {mpl.__version__}")  # matplotlib 3.1.2
print(f" cartopy {cartopy.__version__}")  # cartopy 0.17.0

# construct fake data:
sig = np.sin(np.radians(np.linspace(-90, 90, 192)))
sig = np.tile(sig, [288,1]).T
darr = xr.DataArray(sig, dims=("lat", "lon"), coords={"lat":np.linspace(-90, 90, 192), "lon":np.linspace(0,360,288)})
# darr.plot.pcolormesh()  # Looks fine.

# fig, ax = plt.subplots(subplot_kw={"projection":ccrs.PlateCarree()})
# lons, lats = np.meshgrid(darr['lon'], darr['lat'])
# ax.pcolormesh(lons, lats, darr, transform=ccrs.PlateCarree())  # Looks fine.

cm = plt.get_cmap("viridis")
cm.set_bad("gray")

fig, ax = plt.subplots(subplot_kw={"projection":ccrs.PlateCarree()})
lons, lats = np.meshgrid(darr['lon'], darr['lat'])
ax.pcolormesh(lons, lats, darr, transform=ccrs.PlateCarree())  # Right side of map is gray / userwarning triggered

用户警告是:"UserWarning:已设置颜色映射 'bad',但为了在地图上包裹 pcolormesh,它必须完全透明。"

所以这个警告很清楚,结果是地图上有一半的数据被遮挡。我的问题是如何解决Cartopy的这个限制?


尝试使用cm.set_bad("gray", alpha=0)修复有问题的代码行,alpha参数应该可以解决你的问题。 - swatchai
1
@swatchai -- 这个完全有效!!谢谢。如果你把它发布为答案,我会很高兴接受它。 - brian
很高兴听到这个消息。 - swatchai
1个回答

3
尝试有问题的代码行。
cm.set_bad("gray")

with

cm.set_bad( "gray", alpha=0 )

alpha参数代表“完全透明”,应该可以解决您的问题。

是不是只有我觉得这样并不能完全解决问题,因为完全透明的灰色又会显示为白色? - Lukas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接