2015-07-10 8 views
6

Sto cercando di capire se c'è qualcosa di incorporato in pyplot che cambierà il colore della mia linea a seconda che i dati siano negativi o positivi. Ad esempio, se è negativo mi piacerebbe che la linea fosse rossa e se è positivo vorrei che la linea fosse di un colore diverso, diciamo nero.Pyplot - cambia il colore della linea se i dati sono inferiori a zero?

C'è qualcosa nella libreria che mi consente di fare questo? Una cosa a cui ho pensato è di dividere i dati in due gruppi di positivi e negativi e di tracciarli separatamente, ma mi chiedo se c'è un modo migliore.

risposta

9

Vorrei creare solo due set di dati e impostare le maschere giuste. Utilizzando tale approccio non ho linee tra diverse parti positive .

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

Sto usando questa implementazione e sembra che funzioni, quindi grazie. Inoltre, sto scavando i grafici stile argento nate. Quando provo a usare .style.use dice che il modulo non ha nulla di quel nome - sapresti cosa sta succedendo lì? – MCT

+0

vecchio matplotlib, basta commentare la linea. – tillsten

+0

Lo "stile" è nel nuovo matplotlib? Mi piacerebbe poter usare questo stile – MCT

4

È possibile tracciare in modo condizionale i dati nell'oggetto assi, utilizzando una sintassi simile a where (se si è abituati a qualcosa come 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') 

Tecnicamente, è la divisione e il tracciamento dei dati in due set, ma è abbastanza compatto e bello.

+1

Nota che tracciare le linee tra i passaggi per lo zero. – tillsten

1

Se si utilizza un diagramma a dispersione si può dare ad ogni punto di un colore diverso:

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

Problemi correlati