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