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
函数。您可以通过将数组中的 0
s 替换为 1
s 来尝试一下;这会将问题移植到 0
s 而不是 1
s。
通往解决方案的路线导致忽略阴影线并使用非零 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中,这意味着不使用完整的半球体也可以获得所需的结果。因此,我们不会从 -90
到 90
,而是以稍微低一点的速度开始网格,例如从 -89.99
到 90
.
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()
有谁知道为什么会出现以下情况;我有一个包含 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
函数。您可以通过将数组中的 0
s 替换为 1
s 来尝试一下;这会将问题移植到 0
s 而不是 1
s。
通往解决方案的路线导致忽略阴影线并使用非零 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中,这意味着不使用完整的半球体也可以获得所需的结果。因此,我们不会从 -90
到 90
,而是以稍微低一点的速度开始网格,例如从 -89.99
到 90
.
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()