2017-10-19 81 views
0

我想根据两个其他数组的条件掩盖多个位置中的单个数组。当我这样做,然后绘制原始数组和数组时,它将被屏蔽,数据不会在正确的位置被一致掩盖。下面是一个工作示例代码,它重现问题以及结果图。多次掩盖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() 

Example from Code

正如可以看到,在顶部面板中的数据应当被任何地方所掩蔽的第二面板是大于5且在任何地方第三面板是大于5但小于20。第二显示在顶部面板中的一组数据显然显示在大于5的小数,这正是我的问题。任何人有任何猜测如何从中获得正确的行为?谢谢!

- 将会

+1

您是否知道第一个绘图与其他绘图在不同的水平刻度上?对应于第一个图的一部分的“alt”数据不直接在该部分之下。 – user2357112

+0

你能解释一下你的问题吗,或者通过例子或其他方式 – ChaosPredictor

+0

我知道,但也许这是我的问题。如果我测试len(f1am)== len(alt)== len(lt)我变成了True。那么为什么第一块地块会与其他地块相抵消呢?他们正在密谋vs相同的x值范围。 –

回答

0

掩蔽肯定是从问题的代码正常工作的最后一个值。您可以用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() 

enter image description here

有它不会线图显示,这样你就可以使用一个标记"."向他们展示隐藏区域以外的一些单点。

+0

明天早上我进入办公室时,我会检查是否可以解决问题。感谢您的快速回复! –

+0

你知道为什么你的阴谋条纹不是很垂直吗?这不是一种幻觉;在高变焦时检查图像显示每个蓝色条纹的左边缘稍微倾斜。 – user2357112

+0

我不确定这会修复什么,它更多的是显示代码实际上是正确的。由于我使用的'interpolate = True',跨度边缘确实不是垂直的。我把它留下了,现在是垂直的。无论如何,这些跨度只是为了帮助可视化蒙面区域。 – ImportanceOfBeingErnest

-1

你应该添加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) 
... 
+1

如果你愿意,我也会无缘无故地低估你的答案。 – ImportanceOfBeingErnest

相关问题