2012-04-20 8 views
9

Sto provando a variare il colore di una linea tracciata da dati in due array (ad esempio ax.plot(x,y)). Il colore dovrebbe variare come l'indice negli incrementi x e . Sto essenzialmente cercando di catturare la parametrizzazione naturale del tempo dei dati negli array x e .matplotlib: variazione del colore della linea per acquisire la parametrizzazione del tempo naturale nei dati

In un mondo perfetto, voglio qualcosa di simile:

fig = pyplot.figure() 
ax = fig.add_subplot(111) 
x = myXdata 
y = myYdata 

# length of x and y is 100 
ax.plot(x,y,color=[i/100,0,0]) # where i is the index into x (and y) 

per produrre una linea di colore che varia dal nero al rosso scuro e in rosso brillante.

ho visto examples che funzionano bene per tracciare una funzione esplicitamente parametrizzata da alcune serie 'tempo', ma non riesco a farlo funzionare con dati grezzi ...

risposta

10

Il secondo esempio è quello che si voglio ... ho modificato in base alle proprie esempio, ma ancora più importante leggere i miei commenti per capire cosa sta succedendo:

import numpy as np 
from matplotlib import pyplot as plt 
from matplotlib.collections import LineCollection 

x = myXdata 
y = myYdata 
t = np.linspace(0,1,x.shape[0]) # your "time" variable 

# set up a list of (x,y) points 
points = np.array([x,y]).transpose().reshape(-1,1,2) 
print points.shape # Out: (len(x),1,2) 

# set up a list of segments 
segs = np.concatenate([points[:-1],points[1:]],axis=1) 
print segs.shape # Out: (len(x)-1, 2, 2) 
        # see what we've done here -- we've mapped our (x,y) 
        # points to an array of segment start/end coordinates. 
        # segs[i,0,:] == segs[i-1,1,:] 

# make the collection of segments 
lc = LineCollection(segs, cmap=plt.get_cmap('jet')) 
lc.set_array(t) # color the segments by our parameter 

# plot the collection 
plt.gca().add_collection(lc) # add the collection to the plot 
plt.xlim(x.min(), x.max()) # line collections don't auto-scale the plot 
plt.ylim(y.min(), y.max()) 
+0

Grazie per aver ricordato ciò che sta accadendo con il rimodellare e concatenazione. Funziona bene –

+0

Se vuoi una transizione più fluida tra i segmenti di linea, puoi invece fare 'segs = np.concatenate ([points [: - 2], points [1: -1], points [2:]], axis = 1)'. – shockburner

Problemi correlati