Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to plot a gradient color line in matplotlib?

To state it in a general form, I'm looking for a way to join several points with a gradient color line using matplotlib, and I'm not finding it anywhere. To be more specific, I'm plotting a 2D random walk with a one color line. But, as the points have a relevant sequence, I would like to look at the plot and see where the data has moved. A gradient colored line would do the trick. Or a line with gradually changing transparency.

I'm just trying to improve the vizualization of my data. Check out this beautiful image produced by the ggplot2 package of R. I'm looking for the same in matplotlib. Thanks.

enter image description here

like image 315
PDRX Avatar asked Dec 14 '11 07:12

PDRX


People also ask

How do you draw a line with slope in matplotlib?

Matplotlib: Graph/Plot a Straight Line The slope equation y=mx+c y = m x + c as we know it today is attributed to René Descartes (AD 1596-1650), Father of Analytic Geometry. The equation y=mx+c y = m x + c represents a straight line graphically, where m is its slope/gradient and c its intercept.


1 Answers

Note that if you have many points, calling plt.plot for each line segment can be quite slow. It's more efficient to use a LineCollection object.

Using the colorline recipe you could do the following:

import matplotlib.pyplot as plt import numpy as np import matplotlib.collections as mcoll import matplotlib.path as mpath  def colorline(     x, y, z=None, cmap=plt.get_cmap('copper'), norm=plt.Normalize(0.0, 1.0),         linewidth=3, alpha=1.0):     """     http://nbviewer.ipython.org/github/dpsanders/matplotlib-examples/blob/master/colorline.ipynb     http://matplotlib.org/examples/pylab_examples/multicolored_line.html     Plot a colored line with coordinates x and y     Optionally specify colors in the array z     Optionally specify a colormap, a norm function and a line width     """      # Default colors equally spaced on [0,1]:     if z is None:         z = np.linspace(0.0, 1.0, len(x))      # Special case if a single number:     if not hasattr(z, "__iter__"):  # to check for numerical input -- this is a hack         z = np.array([z])      z = np.asarray(z)      segments = make_segments(x, y)     lc = mcoll.LineCollection(segments, array=z, cmap=cmap, norm=norm,                               linewidth=linewidth, alpha=alpha)      ax = plt.gca()     ax.add_collection(lc)      return lc   def make_segments(x, y):     """     Create list of line segments from x and y coordinates, in the correct format     for LineCollection: an array of the form numlines x (points per line) x 2 (x     and y) array     """      points = np.array([x, y]).T.reshape(-1, 1, 2)     segments = np.concatenate([points[:-1], points[1:]], axis=1)     return segments  N = 10 np.random.seed(101) x = np.random.rand(N) y = np.random.rand(N) fig, ax = plt.subplots()  path = mpath.Path(np.column_stack([x, y])) verts = path.interpolated(steps=3).vertices x, y = verts[:, 0], verts[:, 1] z = np.linspace(0, 1, len(x)) colorline(x, y, z, cmap=plt.get_cmap('jet'), linewidth=2)  plt.show() 

enter image description here

like image 99
unutbu Avatar answered Sep 16 '22 16:09

unutbu