I am trying to vary the color of a line plotted from data in two arrays (eg. ax.plot(x,y)
). The color should vary as the index into x
and y
increases. I am essentially trying to capture the natural 'time' parameterization of the data in arrays x
and y
.
In a perfect world, I want something like:
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)
to produce a line with color varying from black to dark red and on into bright red.
I have seen examples that work well for plotting a function explicitly parameterized by some 'time' array, but I can't get it to work with raw data...
The second example is the one you want... I've edited it to fit your example, but more importantly read my comments to understand what is going on:
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())
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With