2015-07-10 46 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