2015-07-10 44 views
6

我想弄清楚是否有任何內置到pyplot中的內容會根據數據是否爲負值或正值而改變線路的顏色。例如,如果它是負面的,我希望線條是紅色的,如果是正面的,我希望線條是不同的顏色,比如說黑色。Pyplot - 如果數據小於零,則更改行的顏色?

圖書館裏有什麼東西讓我這樣做?我想到的一件事是將數據分成兩組正面和負面的分開繪製它們,但我想知道是否有更好的方法。

回答

9

我只做兩個數據集並設置正確的掩碼。 通過使用這種方法,我不會有不同的積極 部分之間的線。

import matplotlib.pyplot as plt 
import numpy as np 

signal = 1.2*np.sin(np.linspace(0, 30, 2000)) 
pos_signal = signal.copy() 
neg_signal = signal.copy() 

pos_signal[pos_signal <= 0] = np.nan 
neg_signal[neg_signal > 0] = np.nan 

#plotting 
plt.style.use('fivethirtyeight') 
plt.plot(pos_signal, color='r') 
plt.plot(neg_signal, color='b') 
plt.savefig('pos_neg.png', dpi=200) 
plt.show() 

Example

+0

我使用這個實現,它似乎工作,所以謝謝。另外,我正在挖掘那些銀色風格的圖表。當我嘗試使用.style.use時,它說該模塊沒有這個名稱 - 你知道那裏發生了什麼嗎? – MCT

+0

舊的matplotlib,只是註釋掉該行。 – tillsten

+0

在新的matplotlib中是「樣式」嗎?我希望能夠使用這種風格 – MCT

4

您可以使用where類似的語法(如果您習慣於Pandas之類的情況)有條件地繪製軸對象中的數據。

ax.plot(x[f(x)>=0], f(x)[f(x)>=0], 'g') 
ax.plot(x[f(x)<0], f(x)[f(x)<0], 'r') 

從技術上講,它是分裂和繪製你的數據在兩套,但它是相當緊湊和好。

+1

注意,將零個交叉之間的情節線索。 – tillsten

1

如果使用散點圖可以給每個點不同的顏色:

x = range(1) 
x = range(10) 
y = [i - 5 for i in x] 
c = [i < 0 for i in y] 
plt.scatter(x, y, c=c, s=80) 

enter image description here