Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python绘图问题/屏蔽数组/图案填充_Python_Numpy_Matplotlib_Matplotlib Basemap - Fatal编程技术网

Python绘图问题/屏蔽数组/图案填充

Python绘图问题/屏蔽数组/图案填充,python,numpy,matplotlib,matplotlib-basemap,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或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。使用更少的点,我们观察到有两种不同的颜色深浅

这告诉我们,网格的一部分比另一部分打印得更频繁

原因是使用的是球面坐标系。绘图围绕球体(0360)一圈,但也沿正交方向(-90,90)绕球体半圈。然后将外部点连接起来,这样贴图的一部分将被双重着色

作为回报,这意味着可以通过不使用完整的半球来获得所需的结果。因此,我们不是从
-90
90
,而是从稍小的开始,例如从
-89.99
90


没有解决方案-那么这是一个bug吗?如果每一个半天内没有得到答案的问题都是bug,那么我们将有一个全球性的软件崩溃。没有得到快速答案的原因主要是问题没有包含答案。在这种情况下,问题似乎与basemap无关,因此您可以忽略它。它也不需要下载一个巨大的netcdf文件(大多数人不会从互联网上下载未知文件)。由于我没有你的数据,我无法复制你的绘图,但我尝试了使用自生成的数据,其中一个面积等于0,另一个面积等于1。在这种情况下,我无法重现你描述的行为。我想到的唯一一件事是,您的数据不完全是1。(以这种方式比较
float
无论如何都不是一个好主意——在屏蔽之前尝试将数据转换为
int
,即
data=data.astype(np.int)
@JamesWarner importantanceofbeingernest有一点——如果你确实创建了一些虚拟数据,你还能重现这个问题吗?这就是问题的本来面目。现在它很容易重现。现在有两件事很明显:问题不是阴影,而是pcolor的面积(独立于阴影)。这个问题确实是由于使用了底图。我稍后会进一步尝试。啊,这很有趣,现在有意义。还感谢您花时间解释解决方案,以帮助理解。
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) 
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()