我想向 Xarray DataArray 数据添加点画以指示重要性。该数据是经纬度网格上的二维气候数据。我想提供一个 True/False 掩码来绘制映射的变量数据。我正在尝试使用contourf来达到此目的,但如果它们更合适,我愿意接受其他方法。
我尝试过使用 contourf孵化 点画重要区域,但点画点覆盖了所有区域绘图区域。
我发现了 MATLAB 点画文档 和 R 的类似问题“向图像轮廓图添加点画”
下面是我的说明性示例问题。
所需的输出将是左轮廓图,仅在掩码为 True 的情况下带有点画点。
右图显示了我的尝试。您可以看到,无论掩码如何,点画影线都覆盖在所有绘图上,并且掩码值遮盖了 DataArray 的值。
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
def f(x, y):
np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
return
x = np.linspace(0, 5, 51)
y = np.linspace(0, 5, 41)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
da = xr.DataArray(Z, coords = {"lon":x, "lat":y}, dims=["lat", "lon"])
fig =plt.figure(figsize=(12, 6))
ax1 = plt.subplot(121)
ax2 = plt.subplot(122)
ax1.contourf(da.lon, da.lat, da)
mask = da>0.5
ax2.contourf(da.lon, da.lat, da)
ax2.contourf(da.lon, da.lat, mask, hatches=["."])
要使用 Python 在轮廓图中仅在掩码为 True 的地方应用点画,可以使用
contourf
创建两个独立的轮廓图:一个用于数据,另一个用于掩码,并使用
hatches
参数应用点画。
以下是经过修改的代码:
import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
def f(x, y):
return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
x = np.linspace(0, 5, 51)
y = np.linspace(0, 5, 41)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
da = xr.DataArray(Z, coords={"lon": x, "lat": y}, dims=["lat", "lon"])
fig = plt.figure(figsize=(12, 6))
ax1 = plt.subplot(121)
ax2 = plt.subplot(122)
# 第一个轮廓图 - 数据
cf = ax1.contourf(da.lon, da.lat, da)
# 第二个轮廓图 - 点画掩码
mask = da > 0.5
cf2 = ax2.contourf(da.lon, da.lat, da)
ax2.contourf(da.lon, da.lat, mask, hatches=[".", ''], colors='none')
plt.show()
在此代码中:
-
我们像以前一样创建第一个轮廓图 (
cf
) 以显示数据。 -
对于第二个轮廓图 (
cf2
),我们也绘制数据,但更重要的是,我们使用contourf
和hatches
参数绘制了一个附加的轮廓图,其中点画模式仅应用于mask
为 True 的区域。colors='none'
参数确保我们只看到点画,而看不到掩码轮廓的颜色。
此方法应该会在想要的地方应用点画,而不会影响原始数据显示。
标签:python,matplotlib,python-xarray,contourf,stipple From: 78791270