Colormap cluttering?

Hello,

I would like to have a cluttering
functionality to colorbar.

http://en.wikipedia.org/wiki/Clutter_(radar)

Before writing it, I would like to know if
there is a way to doing it with matplotlib.

What I mean by cluttering is:

You’ve got a colormap associated with
a graphic where value goes from 0 to 255 for example.

Assigning a classical colormap (for example
cm.jet) 0 value will be blue and 255 one will be red.

What I need is a low clutter and max clutter,
if I set low clutter to 10 and ax cluter to 250 then:

Blue will be for value from 0 to 10

Then the colormap do his job from 10 to 250
and finally

From 250 to 255 colr will be set to max one
= red.

Is it ever done in matplotlib, if not what
could be the strategy here…?

I was thinking of set_over/set_under but
seems not be exactly what I need because I want to recreate the colormap from
10 to 250 with N segments.

(moreover I don’t understand how you
set the over/under value…)

Laurent

Laurent Dufrechou wrote:

Hello,

I would like to have a cluttering functionality to colorbar.

http://en.wikipedia.org/wiki/Clutter_(radar)

Before writing it, I would like to know if there is a way to doing it
with matplotlib.

What I mean by cluttering is:

You’ve got a colormap associated with a graphic where value goes from 0
to 255 for example.

Assigning a classical colormap (for example cm.jet) 0 value will be blue
and 255 one will be red.

What I need is a low clutter and max clutter, if I set low clutter to
10 and ax cluter to 250 then:

Blue will be for value from 0 to 10

Then the colormap do his job from 10 to 250 and finally

From 250 to 255 colr will be set to max one = red.

Is it ever done in matplotlib, if not what could be the strategy here…?

I was thinking of set_over/set_under but seems not be exactly what I
need because I want to recreate the colormap from 10 to 250 with N segments.

(moreover I don’t understand how you set the over/under value…)

Dear Laurent, if I understand you correctly, set vmin=10 and vmax=250
and it will do what you want.

-Andrew

Laurent Dufrechou wrote:

Hello,

I would like to have a cluttering functionality to colorbar.

http://en.wikipedia.org/wiki/Clutter_(radar)

Before writing it, I would like to know if there is a way to doing it with matplotlib.

What I mean by cluttering is:

You�ve got a colormap associated with a graphic where value goes from 0 to 255 for example.

Assigning a classical colormap (for example cm.jet) 0 value will be blue and 255 one will be red.

What I need is a low clutter and max clutter, if I set low clutter to 10 and ax cluter to 250 then:

Blue will be for value from 0 to 10

Then the colormap do his job from 10 to 250 and finally

From 250 to 255 colr will be set to max one = red.

Is it ever done in matplotlib, if not what could be the strategy here�?

I was thinking of set_over/set_under but seems not be exactly what I need because I want to recreate the colormap from 10 to 250 with N segments.

(moreover I don�t understand how you set the over/under value�)

If you don't really care how many colors are in the map, then for your 0-255 example, try this:

import numpy as np
import matplotlib.pyplot as plt
fakedata = np.random.rand(10,20) * 255.0
cmap = plt.cm.jet
norm = plt.Normalize(vmin=100, vmax=150)
plt.imshow(fakedata, cmap=cmap, norm=norm, interpolation="nearest")
plt.colorbar(extend="both")
plt.show()

I made the colored range small to emphasize what you call the "cluttering" effect.

We are taking advantage of the default, which is that the over and under values are the top and bottom ends of the colormap. If you want other colors for the ends, then after defining your cmap, use, e.g.:

cmap.set_under('w')
cmap.set_over('k')

If you want to use a smaller number of colors in your colormap, then you need to make the colormap this way, for example:

from matplotlib.colors import LinearSegmentedColormap
from matplotlib._cm import _jet_data
cmap = LinearSegmentedColormap("yourname", _jet_data, N=10)

(I should add a helper function to make this more obvious and straightforward.)

Eric

Hi andrew, eric,

Excellent that is exactly what I was looking for :slight_smile:

Laurent

···

-----Message d'origine-----
De : Eric Firing [mailto:efiring@…202…]
Envoyé : mardi 29 juillet 2008 02:39
À : Laurent Dufrechou
Cc : matplotlib-users@lists.sourceforge.net
Objet : Re: [Matplotlib-users] Colormap cluttering?

Laurent Dufrechou wrote:
> Hello,
>
>
>
> I would like to have a cluttering functionality to colorbar.
>
> http://en.wikipedia.org/wiki/Clutter_(radar)
>
>
>
> Before writing it, I would like to know if there is a way to doing it
> with matplotlib.
>
> What I mean by cluttering is:
>
>
>
> You’ve got a colormap associated with a graphic where value goes from
0
> to 255 for example.
>
> Assigning a classical colormap (for example cm.jet) 0 value will be
blue
> and 255 one will be red.
>
> What I need is a low clutter and max clutter, if I set low clutter
to
> 10 and ax cluter to 250 then:
>
> Blue will be for value from 0 to 10
>
> Then the colormap do his job from 10 to 250 and finally
>
> From 250 to 255 colr will be set to max one = red.
>
>
>
> Is it ever done in matplotlib, if not what could be the strategy
here
?
>
> I was thinking of set_over/set_under but seems not be exactly what I
> need because I want to recreate the colormap from 10 to 250 with N
segments.
>
> (moreover I don’t understand how you set the over/under value
)

If you don't really care how many colors are in the map, then for your
0-255 example, try this:

import numpy as np
import matplotlib.pyplot as plt
fakedata = np.random.rand(10,20) * 255.0
cmap = plt.cm.jet
norm = plt.Normalize(vmin=100, vmax=150)
plt.imshow(fakedata, cmap=cmap, norm=norm, interpolation="nearest")
plt.colorbar(extend="both")
plt.show()

I made the colored range small to emphasize what you call the
"cluttering" effect.

We are taking advantage of the default, which is that the over and
under
values are the top and bottom ends of the colormap. If you want other
colors for the ends, then after defining your cmap, use, e.g.:

cmap.set_under('w')
cmap.set_over('k')

If you want to use a smaller number of colors in your colormap, then
you
need to make the colormap this way, for example:

from matplotlib.colors import LinearSegmentedColormap
from matplotlib._cm import _jet_data
cmap = LinearSegmentedColormap("yourname", _jet_data, N=10)

(I should add a helper function to make this more obvious and
straightforward.)

Eric