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

Reply via email to