Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pyplot - change color of line if data is less than zero?

I am trying to figure out if there is anything built into pyplot that will change the color of my line depending on whether or not the data is negative or positive. For example, if it is negative I'd like the line to be red and if it's positive I'd like the line to be a different color, say black.

Is there anything in the library that lets me do this? One thing I've thought of is to split the data into two sets of positive and negative and plotting them separately but I'm wondering if there is a better way.

like image 305
MCT Avatar asked Jul 10 '15 16:07

MCT


3 Answers

I would just make two datasets and setting the right masks. By using that approach i wont have lines between different positive parts.

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

like image 68
tillsten Avatar answered Nov 16 '22 10:11

tillsten


You can conditionally plot data in your axes object, using a where like syntax (if you're used to something like 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')

Technically, it's splitting and plotting your data in two sets, but it's fairly compact and nice.

like image 37
Adam Avatar answered Nov 16 '22 10:11

Adam


If you use a scatter plot you can give each point a different color:

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

like image 5
Mike Avatar answered Nov 16 '22 11:11

Mike