Python绘图问题/掩盖数组/阴影

时间:2017-07-04 21:03:56

标签: python numpy matplotlib matplotlib-basemap

有谁知道为什么会发生以下情况;我有一个包含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()

enter image description here

1 个答案:

答案 0 :(得分:3)

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

解决方案的路线忽略了阴影并使用非零α。使用更少的点,我们观察到有两种不同的颜色,

enter image description here

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)也是一半。然后连接外部点,使得部分地图被双色化。

作为回报,这意味着可以通过不使用完整的半球来获得期望的结果。因此,我们不会从-90转到90,而是会稍微开始网格,例如从-89.9990

enter image description here

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()