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.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")
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
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)
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
On 06/02/2012 03:37 AM, Chao YUE wrote:
thanks et cheers,