2017-10-19 96 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

相關問題