2017-07-18 96 views
1

我有一些數據的陣列,其中一些值是缺少虛線代替matplotlib缺失值

y = np.array([np.NAN, 45, 23, np.NAN, 5, 14, 22, np.NAN, np.NAN, 18, 23]) 

當我繪製它,我有這些NANS缺失(預計)

fig, ax = plt.subplots() 
ax.plot(y) 
plt.show() 

enter image description here

我想有是連接中缺失的段虛線。例如,在缺少數據點爲3的情況下,應該有其缺少數據點7和8 2和4(在它們之間連接的現有點的虛線如果數據點是在間隔的邊緣(數據點0)我想擁有一個橫線連接它們(想象一個/下一個數據點一樣可用的邊緣)。


的問題,我saw這裏詢問如何刪除這些空段(不是我想要的)。我可以通過創建另一個數組裏面會有丟失的插值和所有其他值NAN解決它,但它看起來複雜的給我。

因爲這看起來像一個常見的情況,我希望有一個更簡單做法。

回答

3

我想說從鏈接的問題該解決方案可以在這裏直接應用,繪製直線背後的虛線。

import numpy as np 
import matplotlib.pyplot as plt 

y = np.array([np.NAN, 45, 23, np.NAN, 5, 14, 22, np.NAN, np.NAN, 18, 23]) 
x = np.arange(0, len(y)) 
mask = np.isfinite(y) 

fig, ax = plt.subplots() 
line, = ax.plot(x[mask],y[mask], ls="--",lw=1) 
ax.plot(x,y, color=line.get_color(), lw=1.5) 

plt.show() 

enter image description here

爲了考慮在邊緣值的情況下的水平線,可以檢查它們是否南,並與鄰近值替換它們。

import numpy as np 
import matplotlib.pyplot as plt 

y = np.array([np.NAN, 45, 23, np.NAN, 5, 14, 22, np.NAN, np.NAN, 18, 23,np.NAN]) 
x = np.arange(0, len(y)) 
yp = np.copy(y) 
if ~np.isfinite(y[0]): yp[0] = yp[1] 
if ~np.isfinite(y[-1]): yp[-1] = yp[-2] 

mask = np.isfinite(yp) 


fig, ax = plt.subplots() 
line, = ax.plot(x[mask],yp[mask], ls="--",lw=1) 
ax.plot(x,y, color=line.get_color(), lw=1.5) 

plt.show() 

enter image description here

+0

任何想法如何處理邊緣值? –

+0

由於邊緣沒有任何價值,所以先不明白怎麼處理它,對吧?所以你需要知道它是否具有某種意義,以及它應該採取什麼樣的價值。 – ImportanceOfBeingErnest

+0

在我的問題中,我提到在邊緣值的情況下,我想要有一條水平線。基本上,如果我有'nan,43',我想要一條虛線'43,43'。 –

3

你要尋找的效果快速簡單的方法是繪製同一系列的兩倍,像這樣:

y = np.array([np.NAN, 45, 23, np.NAN, 5, 14, 22, np.NAN, np.NAN, 18, 23]) 
x = np.arange(len(y)) 
_y = y[~np.isnan(y)] 
_x = x[~np.isnan(y)] 
fig, ax = plt.subplots() 

ax.plot(_x, _y, linestyle="--", lw=.5) 
ax.plot(x, y, lw=1) 

需要注意的是,其連接缺失值第一繪圖,然後非行缺失值是覆蓋圖(您也可以在調用繪圖命令時使用 kwarg來控制繪圖順序)。上面的代碼創建了這一點:

enter image description here

+0

任何想法如何應對邊緣值? –

+0

有很多方法可以處理丟失的邊緣數據,具體取決於您試圖展示的內容。通常我會說,前面的'nan'值應該只被丟棄,但如果你使用'nan'表示有用的數據,如非檢測化學分析時間序列的話,我可以考慮使用散點圖填補'nan'值與分析方法檢測限制。你的理由在丟失的數據可能會有所不同灌裝,但一旦你選擇了一個方法(和原因),你可以問一個問題,如果你想使用'matplotlib'繪製它你預想的方式幫助。 – aorr