多次掩盖Numpy数组会产生错误的结果
我想根据两个其他数组的条件掩盖多个位置中的单个数组。当我这样做,然后绘制原始数组和数组时,它将被屏蔽,数据不会在正确的位置被一致掩盖。下面是一个工作示例代码,它重现问题以及结果图。多次掩盖Numpy数组会产生错误的结果
import numpy as np
import matplotlib.pyplot as plt
f1 = np.random.randint(51, size=150)
lt_vals = np.arange(0,25,1)
alt_vals = np.arange(0,15,1)
alt = np.tile(alt_vals,10)
lt = np.tile(lt_vals, 6)
x_vals = range(len(f1))
f1m = np.ma.masked_where((lt>5) & (lt<20), f1)
f1am = np.ma.masked_where(alt>5, f1m)
variables = [f1am, alt, lt]
ylabels = ['Function', 'Sim Alt', 'Sim Time']
number_of_subplots= len(variables)
plt.figure(figsize = (12,12))
for i,j,k in zip(range(number_of_subplots), variables, ylabels):
ax1 = plt.subplot(number_of_subplots,1,i+1)
ax1.plot(x_vals,j)
ax1.set_ylabel(k)
plt.show()
正如可以看到,在顶部面板中的数据应当被任何地方所掩蔽的第二面板是大于5且在任何地方第三面板是大于5但小于20。第二显示在顶部面板中的一组数据显然显示在大于5的小数,这正是我的问题。任何人有任何猜测如何从中获得正确的行为?谢谢!
- 将会
掩蔽肯定是从问题的代码正常工作的最后一个值。您可以用fill_between
可视化屏蔽的范围。而且,共享所有轴可以更容易地比较三个图。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["axes.xmargin"] = 0
plt.rcParams["axes.ymargin"] = 0
f1 = np.random.randint(51, size=150)
lt_vals = np.arange(0,25,1)
alt_vals = np.arange(0,15,1)
alt = np.tile(alt_vals,10)
lt = np.tile(lt_vals, 6)
x_vals = range(len(f1))
f1m = np.ma.masked_where((lt>5) & (lt<20), f1)
f1am = np.ma.masked_where(alt>5, f1m)
variables = [f1am, alt, lt]
ylabels = ['Function', 'Sim Alt', 'Sim Time']
number_of_subplots= len(variables)
fig, axes = plt.subplots(nrows=3, sharex=True)
for i,j,k in zip(range(number_of_subplots), variables, ylabels):
ax1 = axes[i]
ax1.plot(x_vals,j, marker=".")
ax1.set_ylabel(k)
axes[1].fill_between(x_vals,alt.max(),0, where=alt>5, alpha=0.2)
axes[2].fill_between(x_vals,lt.max(),0, where=(lt>5) & (lt<20), alpha=0.2)
axes[0].fill_between(x_vals,51,0, where=((lt>5) & (lt<20)) | (alt>5) , alpha=0.2)
plt.show()
有它不会线图显示,这样你就可以使用一个标记"."
向他们展示隐藏区域以外的一些单点。
明天早上我进入办公室时,我会检查是否可以解决问题。感谢您的快速回复! –
你知道为什么你的阴谋条纹不是很垂直吗?这不是一种幻觉;在高变焦时检查图像显示每个蓝色条纹的左边缘稍微倾斜。 – user2357112
我不确定这会修复什么,它更多的是显示代码实际上是正确的。由于我使用的'interpolate = True',跨度边缘确实不是垂直的。我把它留下了,现在是垂直的。无论如何,这些跨度只是为了帮助可视化蒙面区域。 – ImportanceOfBeingErnest
你应该添加f1am
...
f1m = np.ma.masked_where((lt>5) & (lt<20), f1)
f1am = np.ma.masked_where(alt>5, f1m)
print(len(x_vals))
f1am[149] = 0
variables = [f1am, alt, lt]
ylabels = ['Function', 'Sim Alt', 'Sim Time']
number_of_subplots= len(variables)
...
如果你愿意,我也会无缘无故地低估你的答案。 – ImportanceOfBeingErnest
您是否知道第一个绘图与其他绘图在不同的水平刻度上?对应于第一个图的一部分的“alt”数据不直接在该部分之下。 – user2357112
你能解释一下你的问题吗,或者通过例子或其他方式 – ChaosPredictor
我知道,但也许这是我的问题。如果我测试len(f1am)== len(alt)== len(lt)我变成了True。那么为什么第一块地块会与其他地块相抵消呢?他们正在密谋vs相同的x值范围。 –