Oops. I meant to reply to the list.
-Tony
···
---------- Forwarded message ----------
From: Tony Yu <tsyu80@…287…>
Date: Sat, Jul 30, 2011 at 10:46 AM
Subject: Re: [Matplotlib-users] parametric line color
To: Alan G Isaac <alan.isaac@…287…>
On Sat, Jul 30, 2011 at 12:03 AM, Alan G Isaac <alan.isaac@…287…> wrote:
I have many lines to plot.
Each line has an associated parameter value.
I’d like to pick the color for each line
based on its parameter value by mapping
possible parameter values to the colors
in a color map (e.g., gist_rainbow),
retrieving colors one at a time (based
on the parameter value for a line).
If two lines have the same parameter value,
I need them to have exactly the same color.
Hints?
Thanks,
Alan Isaac
Here’s a function to do what you want. (I haven’t tested it much so it could be buggy)
Best,
-Tony
#----
import matplotlib.pyplot as plt
def make_color_manager(parameter_range, cmap=‘YlOrBr’, start=0, stop=255):
"""Return color manager, which returns color based on parameter value.
Parameters
----------
parameter_range : 2-tuple
minimum and maximum value of parameter
cmap : str
name of a matplotlib colormap (see [matplotlib.pyplot.cm](http://matplotlib.pyplot.cm))
start, stop: int
limit colormap to this range (0 <= start < stop <= 255)
"""
colormap = getattr([plt.cm](http://plt.cm), cmap)
pmin, pmax = parameter_range
def color_manager(val):
"""Return color based on parameter value `val`."""
assert pmin <= val <= pmax
val_norm = (val - pmin) * float(stop - start) / (pmax - pmin)
idx = int(val_norm) + start
return colormap(idx)
return color_manager
if name == ‘main’:
cm = make_color_manager((5, 10), start=100)
plt.plot([0, 1], color=cm(5))
plt.plot([0.5, 0.5], color=cm(7.5))
plt.plot([1, 0], color=cm(10))
plt.legend((‘val = 5’, ‘val = 7.5’, ‘val = 10’))
plt.show()