Matplotlib 为Cartopy贴图中缺少的数据指定不透明颜色
在将Cartopy与matplotlib的pcolormesh一起使用以制作贴图时,我无法为缺少的值指定颜色。我希望所有的“nan”值都是灰色的,而不是白色/透明的。为此,我尝试使用matplotlib colormaps的Matplotlib 为Cartopy贴图中缺少的数据指定不透明颜色,matplotlib,cartopy,Matplotlib,Cartopy,在将Cartopy与matplotlib的pcolormesh一起使用以制作贴图时,我无法为缺少的值指定颜色。我希望所有的“nan”值都是灰色的,而不是白色/透明的。为此,我尝试使用matplotlib colormaps的set\u bad方法,但这似乎破坏了Cartopy。这个问题触发了Cartopy的用户警告,但我不知道解决方法是什么 下面的示例甚至没有nan值,但显示了问题: import xarray as xr import numpy as np import matplotlib
set\u bad
方法,但这似乎破坏了Cartopy。这个问题触发了Cartopy的用户警告,但我不知道解决方法是什么
下面的示例甚至没有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是:“Userwarning:colormap的'bad'已设置,但为了在整个映射中包装pcolormesh,它必须是完全透明的。”
因此,警告是明确的,结果是地图上一半的数据被掩盖了。我的问题是如何绕过Cartopy的这个限制 试试有问题的代码行
cm.set_bad("gray")
与
表示“完全透明”的alpha参数应该可以解决您的问题。用
cm尝试有问题的代码行。set\u bad(“灰色”,alpha=0)
,alpha
参数应该可以解决您的问题。@swatchai——这完全有效!!非常感谢。如果你作为一个答案发布,我很乐意接受。很高兴听到这个。
cm.set_bad( "gray", alpha=0 )