2013-04-05 46 views
0

不同linestyles情節我有這兩個numpy陣列如何pylab

import numpy as np 
    a=np.array([1,2,3,4,5,6,7,8,9]) 
    b=np.array([-1,-2,-3,-4,-5,1,2,-3,-4]) 

我可以很容易地繪製出來,像這樣

from pylab import * 
    plot(a,b,'b-',lw=2) 

我想表現出負b用點不同的線型,例如虛線。

我能做到這一點

plot(a[(b<0)],b[(b<0)],'b--',lw=2) 

但是這一條線連接所有的點。舉例來說,我不想與A = 5和B點= -4與具有= 8和b點連接= -3

+0

上次在他們的文檔中,我查了一下。只是檢查出來。 – 2013-04-05 11:04:14

+0

所以你想通過所有點但通過不同的線條樣式的一個情節? – 2013-04-05 11:11:20

+0

@LevLevitsky:是的,這是正確的 – Brian 2013-04-05 11:31:50

回答

2

可以使用掩模陣列:

import numpy as np 
a=np.array([1,2,3,4,5,6,7,8,9]) 
b=np.array([-1,-2,-3,-4,-5,1,2,-3,-4]) 

plot(a, b) 
m = b > 0 
plot(np.ma.array(a, mask=m), np.ma.array(b, mask=m), 'r--', lw=2) 

enter image description here

但是,我認爲這可能不是你想要的。這裏是一個快速方法,可以將線路分爲兩個部分:

import numpy as np 
a=np.array([1,2,3,4,5,6,7,8,9]) 
b=np.array([-1,-2,-3,-4,-5,1,2,-3,-4]) 

x = np.linspace(a.min(), a.max(), 1000) 
y = np.interp(x, a, b) 

m = y <= 0 
plot(np.ma.array(x, mask=m), np.ma.array(y, mask=m), 'b-', lw=2) 
m = y > 0 
plot(np.ma.array(x, mask=m), np.ma.array(y, mask=m), 'r--', lw=2) 

enter image description here

np.interp()會使用很多的內存對於大型數據集,這裏要說的是找到所有零點的另一種方法。輸出與上面相同。

idx1 = np.where(b[1:] * b[:-1] < 0)[0] 
idx2 = idx1 + 1 

x0 = a[idx1] + np.abs(b[idx1]/(b[idx2] - b[idx1])) * (a[idx2] - a[idx1]) 

a2 = np.insert(a, idx2, x0) 
b2 = np.insert(b, idx2, 0) 

m = b2 < 0 
plot(np.ma.array(a2, mask=m), np.ma.array(b2, mask=m), 'b-', lw=2) 
m = b2 > 0 
plot(np.ma.array(a2, mask=m), np.ma.array(b2, mask=m), 'r--', lw=2)