get colorlist and values from existing matplotlib colormaps?

Dear all,

I find I would like to make some change from the existing colormaps. for example, I would like to change the color at the beginning of the colormap (let’s say mat.cm.jet) but I still
want to use the remaining other colors. So is there way I can easily use some functions already in matplotlib to extract the colorlist and levels from a mat.cm.jet?
Then I can just change the first color of the colorlist, and use mat.colors.LinearSegmentedColormap.from_list to easily construct the colormap I want.

I can use mat.cm.jet._segmentdata to retrieve the dictionary. I also have a look at the source code /usr/local/lib/python2.7/dist-packages/matplotlib/colors.py but I didn’t manage to find a solution.

both mat.colors.LinearSegmentedColormap and mat.colors.ListedColormap finally calls mat.colors.Colormap.init and then I don’t understand how these colorlist are really used for plotting.

Another question, where can I find the source code where mat.cm.jet is defined?

thanks et cheers,

Chao

···


Chao YUE
Laboratoire des Sciences du Climat et de l’Environnement (LSCE-IPSL)
UMR 1572 CEA-CNRS-UVSQ
Batiment 712 - Pe 119
91191 GIF Sur YVETTE Cedex

Tel: (33) 01 69 08 29 02; Fax:01.69.08.77.16


Dear all,

I find I would like to make some change from the existing colormaps. for
example, I would like to change the color at the beginning of the
colormap (let's say mat.cm.jet) but I still
want to use the remaining other colors. So is there way I can easily use
some functions already in matplotlib to extract the colorlist and levels
from a mat.cm.jet?
Then I can just change the first color of the colorlist, and use
mat.colors.LinearSegmentedColormap.from_list to easily construct the
colormap I want.

Try playing with something like this (in ipython --pylab):

jetcmap = cm.get_cmap("jet", 10) #generate a jet map with 10 values
jet_vals = jetcmap(np.arange(10)) #extract those values as an array
jet_vals[0] = [0.1, 0, 0.1, 1] #change the first value
newcmap = mpl.colors.LinearSegmentedColormap.from_list("newjet", jet_vals)
imshow(rand(18,20), cmap=newcmap, vmin=0, vmax=1, interpolation="nearest")
colorbar()

Alternatively, you can copy the cm.datad['jet'] dictionary (datad is a dictionary of dictionaries), modify it, and use it to initialize a custom LinearSegmentedColormap instance. See http://matplotlib.sourceforge.net/examples/pylab_examples/custom_cmap.html.

I can use mat.cm.jet._segmentdata to retrieve the dictionary. I also
have a look at the source code

In general it is not a good idea to work with attributes with leading underscores, which flag them as especially low-level implementation-dependent details. cm.jet._segmentdata can be accessed as cm.datad['jet'].

Note also that the _segmentdata is not what is used directly to look up the colors; instead it is used to generate the lookup table (_lut attribute). See below.

/usr/local/lib/python2.7/dist-packages/matplotlib/colors.py but I didn't
manage to find a solution.

both mat.colors.LinearSegmentedColormap and mat.colors.ListedColormap
finally calls mat.colors.Colormap.__init__ and then I don't understand
how these colorlist are really used for plotting.

Typically it is a two-stage process. First, a data array is passed to a Normalize instance which scales it to the range from zero to one. Second, that scaled array is passed to the Colormap instance, which uses its lookup table to map any point in the 0-1 range to a color.

Less commonly, instead of passing an array of floats to the Colormap instance, one may pass in an integer array, in which case these integers are used directly as indices into the lookup table (which is the _lut attribute of the Colormap instance.)

Another question, where can I find the source code where mat.cm.jet is
defined?

Good question; the answer is obscured by somewhat convoluted coding in cm.py. The relevant part is this:

for cmapname in datad.iterkeys():
     cmap_d[cmapname] = _generate_cmap(cmapname, LUTSIZE)

locals().update(cmap_d)

The first block is filling a dictionary with LinearSegmentedColormap instances corresponding to the named sets of segment data from _cm.py.
The "locals" line is the tricky part: it is adding each entry in that dictionary to the local namespace, so that cm.cmap_d["jet"] can be accessed as cm.jet, etc.

There is a bit more to it, because Colormap instances can handle three special values: over range, under range, and "bad" (masked). See http://matplotlib.sourceforge.net/examples/pylab_examples/contourf_demo.html
and
http://matplotlib.sourceforge.net/examples/pylab_examples/image_masked.html

Eric

···

On 06/02/2012 03:37 AM, Chao YUE wrote:

thanks et cheers,

Chao

Thanks Eric. This is quite an informative answer about colormap!
The first part of the answer is exactly what I need.

cheers,

Chao

efiring wrote:

···

On 06/02/2012 03:37 AM, Chao YUE wrote:

Dear all,

I find I would like to make some change from the existing colormaps. for
example, I would like to change the color at the beginning of the
colormap (let's say mat.cm.jet) but I still
want to use the remaining other colors. So is there way I can easily use
some functions already in matplotlib to extract the colorlist and levels
from a mat.cm.jet?
Then I can just change the first color of the colorlist, and use
mat.colors.LinearSegmentedColormap.from_list to easily construct the
colormap I want.

Try playing with something like this (in ipython --pylab):

jetcmap = cm.get_cmap("jet", 10) #generate a jet map with 10 values
jet_vals = jetcmap(np.arange(10)) #extract those values as an array
jet_vals[0] = [0.1, 0, 0.1, 1] #change the first value
newcmap = mpl.colors.LinearSegmentedColormap.from_list("newjet", jet_vals)
imshow(rand(18,20), cmap=newcmap, vmin=0, vmax=1, interpolation="nearest")
colorbar()

Alternatively, you can copy the cm.datad['jet'] dictionary (datad is a
dictionary of dictionaries), modify it, and use it to initialize a
custom LinearSegmentedColormap instance. See
http://matplotlib.sourceforge.net/examples/pylab_examples/custom_cmap.html.

I can use mat.cm.jet._segmentdata to retrieve the dictionary. I also
have a look at the source code

In general it is not a good idea to work with attributes with leading
underscores, which flag them as especially low-level
implementation-dependent details. cm.jet._segmentdata can be accessed as
cm.datad['jet'].

Note also that the _segmentdata is not what is used directly to look up
the colors; instead it is used to generate the lookup table (_lut
attribute). See below.

/usr/local/lib/python2.7/dist-packages/matplotlib/colors.py but I didn't
manage to find a solution.

both mat.colors.LinearSegmentedColormap and mat.colors.ListedColormap
finally calls mat.colors.Colormap.__init__ and then I don't understand
how these colorlist are really used for plotting.

Typically it is a two-stage process. First, a data array is passed to a
Normalize instance which scales it to the range from zero to one.
Second, that scaled array is passed to the Colormap instance, which uses
its lookup table to map any point in the 0-1 range to a color.

Less commonly, instead of passing an array of floats to the Colormap
instance, one may pass in an integer array, in which case these integers
are used directly as indices into the lookup table (which is the _lut
attribute of the Colormap instance.)

Another question, where can I find the source code where mat.cm.jet is
defined?

Good question; the answer is obscured by somewhat convoluted coding in
cm.py. The relevant part is this:

for cmapname in datad.iterkeys():
     cmap_d[cmapname] = _generate_cmap(cmapname, LUTSIZE)

locals().update(cmap_d)

The first block is filling a dictionary with LinearSegmentedColormap
instances corresponding to the named sets of segment data from _cm.py.
The "locals" line is the tricky part: it is adding each entry in that
dictionary to the local namespace, so that cm.cmap_d["jet"] can be
accessed as cm.jet, etc.

There is a bit more to it, because Colormap instances can handle three
special values: over range, under range, and "bad" (masked). See
http://matplotlib.sourceforge.net/examples/pylab_examples/contourf_demo.html
and
http://matplotlib.sourceforge.net/examples/pylab_examples/image_masked.html

Eric

thanks et cheers,

Chao

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


View this message in context: http://old.nabble.com/get-colorlist-and-values-from-existing-matplotlib-colormaps--tp33949604p33965531.html
Sent from the matplotlib - users mailing list archive at Nabble.com.