Python 绘图问题/屏蔽数组/阴影线

Python plotting issue / masked array / hatching

有谁知道为什么会出现以下情况;我有一个包含 1 或 0 的数据数组。下面的代码,其中 data = np.ma.masked_equal(data, 1) 屏蔽数据为 1 的任何点,仅在零上留下阴影线。这没有按预期工作(到处都是孵化线)。有什么想法吗?

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap

data = np.zeros((324,432))
data[:,0:100] = 1

data = data.astype(np.int)

Lons_I,Lats_I = np.meshgrid(np.linspace(0,360,432),np.linspace(-90,90,324))


m = Basemap(projection='npstere',boundinglat=60,lon_0=0,resolution='c')
m.drawcoastlines(linewidth=0.3)
X, Y = m(Lons_I, Lats_I)
cs = m.contourf(X,Y,data,np.linspace(-5,5,26),cmap='RdBu_r',extend='both')

data = np.ma.masked_equal(data, 1)

plt.pcolor(X,Y,data, hatch=".",alpha=0)
cbar = m.colorbar(cs)


plt.show()

问题不在于孵化。它也不是 np.ma.masked_equal 函数。您可以通过将数组中的 0s 替换为 1s 来尝试一下;这会将问题移植到 0s 而不是 1s。

通往解决方案的路线导致忽略阴影线并使用非零 alpha。使用更少的点,我们观察到颜色有两种不同的深浅,

data = np.zeros((18,25))
data[:,0:9] = 1
Lons_I,Lats_I = np.meshgrid(np.linspace(0,360,25),np.linspace(-90,90,18))

m = Basemap(projection='npstere',boundinglat=60,lon_0=0,resolution='c')
m.drawcoastlines(linewidth=0.3)
X, Y = m(Lons_I, Lats_I)

data = np.ma.masked_equal(data, 1)

plt.pcolor(X,Y,data, alpha=0.3) 

这告诉我们网格的一部分比另一部分绘制得更频繁。

原因是使用的球坐标系。该图绕球体 (0,360) 转一圈,但也在正交方向 (-90,90) 转一圈。然后将外部点连接起来,这样地图的一部分就会加倍着色。

在return中,这意味着不使用完整的半球体也可以获得所需的结果。因此,我们不会从 -9090,而是以稍微低一点的速度开始网格,例如从 -89.9990.

import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap

data = np.zeros((324,432))
data[:,0:100] = 1

Lons_I,Lats_I = np.meshgrid(np.linspace(0,360,432),np.linspace(-89.99,90,324))

m = Basemap(projection='npstere',boundinglat=60,lon_0=0,resolution='c')
m.drawcoastlines(linewidth=0.3)
X, Y = m(Lons_I, Lats_I)
cs = m.contourf(X,Y,data,np.linspace(-5,5,26),cmap='RdBu_r',extend='both')

data = np.ma.masked_equal(data, 1)

plt.pcolor(X,Y,data, hatch=".", alpha=0) 
cbar = m.colorbar(cs)

plt.show()