How can I put a white area in the middle of colorbar showing the masked data?

Dear all,

In many cases in geoscience mapping we want to show the some missing values

as some special color in the colorbar. like attached one.

I know there is one method in matplotlib colormap called “set_bad”, official

docs says:

Set color to be used for masked values.

But I don’t know how to make this work when I call the colorbar method.

Is there anyone who have the some successful experience?

Thanks a lot in advance!

Chao

colorbar_eg.png

···


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


sorry, the attached file may lack surfix type, here is the correct one.

Cheers,

chao

colorbar_eg.png

···

On Sat, Mar 1, 2014 at 8:57 PM, Chao YUE <chaoyuejoy@…287…> wrote:

Dear all,

In many cases in geoscience mapping we want to show the some missing values

as some special color in the colorbar. like attached one.

I know there is one method in matplotlib colormap called “set_bad”, official

docs says:

Set color to be used for masked values.


But I don’t know how to make this work when I call the colorbar method.

Is there anyone who have the some successful experience?

Thanks a lot in advance!

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



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,

In many cases in geoscience mapping we want to show the some missing values
as some special color in the colorbar. like attached one.

I know there is one method in matplotlib colormap called "set_bad", official
docs says:

Set color to be used for masked values.

But I don't know how to make this work when I call the colorbar method.

It is not a matter of calling the colorbar method, but of setting up the colormap used on the color-mapped plot for which the colorbar is made.

The one wrinkle to this is that if you are using contourf, the masked regions are not filled at all, so they take on the color of the background. To give them the color you assigned to the colormap with set_bad, you need to assign that same color to the background, e.g.

ax.set_axis_bgcolor("#bdb76b")

On re-reading your message, however, I think you are asking something else, but it is not clear to me from your example exactly what you are trying to do.

The colorbar is strictly for a range or sequence of colors, which can include triangle regions for the "over" and "under" values; there is no place on the colorbar for a "bad" or "missing" value. Where would you put one? I don't see any such region on the example colorbar you attached.

Eric

···

On 2014/03/01 9:57 AM, Chao YUE wrote:

Is there anyone who have the some successful experience?

Thanks a lot in advance!

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
************************************************************************************

------------------------------------------------------------------------------
Flow-based real-time traffic analytics software. Cisco certified tool.
Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer
Customize your own dashboards, set traffic alerts and generate reports.
Network behavioral analysis & security monitoring. All-in-one tool.
http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk

_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Hi Eric,

thanks for answering. I updated the attached figure.

The idea is, we want to show the tree cover difference, but to make
the negative and positive values very contrastive, we would like to

assign the values falling in small range of change (in the figure, it’s -1 to 1)

as blank (or gray), in order to make the remaining data constrasting different.

The most correct way might be to design a new colormap with white color

exactly in the middle, however this is very tedious, especially if I want to try
different colormaps. so the alternative approach would be to set the values
falling in (-1,1) as being masked, so they will be the same as the axes

background color as you mentioned (in our case it’s white). My question is,
how can I put this background color (which shows maksed data) in the colorbar,

by avoiding design a new colormap?

Then I notice in the colormap methos there is one called “set_bad”, I guess this
is for this purpose, as in the case of “set_over” and “set_under”, which will

influence the colors in the colorbar when you later call the colorbar method.

But is it not like this?

I invented an example like below:

import numpy as np

import matplotlib as mat

import matplotlib.pyplot as plt

data = np.random.random(10000).reshape(100,100) - 0.5
data_masked = np.ma.masked_inside(data,-0.05,0.05)
cmap = mat.cm.jet

cmap.set_bad(‘0.5’)
fig,ax = plt.subplots(1,1)
lev = [-0.5,-0.4,-0.3,-0.2,-0.1,-0.05,0,0.05,0.1,0.2,0.3,0.4,0.5]
cas = ax.contourf(data_masked,levels=lev,cmap=cmap)
plt.colorbar(cas,ticks=lev)

In this example, how can I make the colors between -0.05 to 0.05 as white,
if I don’t want to bother write a new colormap.

Thanks a lot for your time, I hope this case could be useful for others as I

am sure it’s very widely used in geographic related sciences.

Cheers,

Chao

colorbar_eg.png (74K) Download Attachment

···

On Sat, Mar 1, 2014 at 9:16 PM, Eric Firing [via matplotlib] <[hidden email]> wrote:

On 2014/03/01 9:57 AM, Chao YUE wrote:

Dear all,

In many cases in geoscience mapping we want to show the some missing values

as some special color in the colorbar. like attached one.

I know there is one method in matplotlib colormap called “set_bad”, official

docs says:

Set color to be used for masked values.

But I don’t know how to make this work when I call the colorbar method.

It is not a matter of calling the colorbar method, but of setting up the
colormap used on the color-mapped plot for which the colorbar is made.

The one wrinkle to this is that if you are using contourf, the masked
regions are not filled at all, so they take on the color of the
background. To give them the color you assigned to the colormap with
set_bad, you need to assign that same color to the background, e.g.

ax.set_axis_bgcolor("#bdb76b")

On re-reading your message, however, I think you are asking something
else, but it is not clear to me from your example exactly what you are
trying to do.

The colorbar is strictly for a range or sequence of colors, which can
include triangle regions for the “over” and “under” values; there is no
place on the colorbar for a “bad” or “missing” value. Where would you
put one? I don’t see any such region on the example colorbar you attached.

Eric

Is there anyone who have the some successful experience?

Thanks a lot in advance!

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



Flow-based real-time traffic analytics software. Cisco certified tool.

Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer

Customize your own dashboards, set traffic alerts and generate reports.

Network behavioral analysis & security monitoring. All-in-one tool.

http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk


Matplotlib-users mailing list

[hidden email]

https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Flow-based real-time traffic analytics software. Cisco certified tool.

Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer

Customize your own dashboards, set traffic alerts and generate reports.

Network behavioral analysis & security monitoring. All-in-one tool.

http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk


Matplotlib-users mailing list

[hidden email]

https://lists.sourceforge.net/lists/listinfo/matplotlib-users


If you reply to this email, your message will be added to the discussion below:

http://matplotlib.1069221.n5.nabble.com/How-can-I-put-a-white-area-in-the-middle-of-colorbar-showing-the-masked-data-tp42948p42950.html

To start a new topic under matplotlib - users, email [hidden email]

  To unsubscribe from matplotlib, click here.


  [NAML](http://matplotlib.1069221.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml)


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


It's not the answer you want to hear, but I think the correct answer is that you should do this via the colormap, and not by masking the low values. It doesn't have to be painful. If, in contourf, you use a diverging colormap with white already in the middle (http://matplotlib.org/examples/color/colormaps_reference.html) and a norm with symmetric limits (vmin and vmax; you can let them be set automatically after you specify your symmetric set of contour boundaries appropriately) then it will be done for you.

e.g.,

z = 10 * np.random.randn(20, 30)
clevs = [-10, -5, -2, -1, 1, 2, 5, 10]
cs = plt.contourf(z, levels=clevs, cmap=plt.get_cmap('PRGn'),
                   extend='both')
cbar = plt.colorbar(cs, spacing='uniform')

Eric

···

On 2014/03/01 11:03 AM, ChaoYue wrote:

The most correct way might be to design a new colormap with white color
exactly in the middle, however this is very tedious, especially if I
want to try
different colormaps. so the alternative approach would be to set the values
falling in (-1,1) as being masked, so they will be the same as the axes
background color as you mentioned (in our case it's white). My question is,
how can I put this background color (which shows maksed data) in the
colorbar,
by avoiding design a new colormap?

Dear Eric,

This solved part of my problem. thanks a lot.

I think I will revisit this issue when I have time (not promised).

do you think this could be some feature desirable?

Cheers,

Chao

···

On Sat, Mar 1, 2014 at 10:39 PM, Eric Firing [via matplotlib] <[hidden email]> wrote:

On 2014/03/01 11:03 AM, ChaoYue wrote:

The most correct way might be to design a new colormap with white color

exactly in the middle, however this is very tedious, especially if I

want to try

different colormaps. so the alternative approach would be to set the values

falling in (-1,1) as being masked, so they will be the same as the axes

background color as you mentioned (in our case it’s white). My question is,

how can I put this background color (which shows maksed data) in the

colorbar,

by avoiding design a new colormap?

It’s not the answer you want to hear, but I think the correct answer is
that you should do this via the colormap, and not by masking the low
values. It doesn’t have to be painful. If, in contourf, you use a
diverging colormap with white already in the middle
(http://matplotlib.org/examples/color/colormaps_reference.html) and a
norm with symmetric limits (vmin and vmax; you can let them be set
automatically after you specify your symmetric set of contour boundaries
appropriately) then it will be done for you.

e.g.,

z = 10 * np.random.randn(20, 30)

clevs = [-10, -5, -2, -1, 1, 2, 5, 10]

cs = plt.contourf(z, levels=clevs, cmap=plt.get_cmap(‘PRGn’),

               extend='both')

cbar = plt.colorbar(cs, spacing=‘uniform’)

Eric


Flow-based real-time traffic analytics software. Cisco certified tool.

Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer

Customize your own dashboards, set traffic alerts and generate reports.

Network behavioral analysis & security monitoring. All-in-one tool.

http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk


Matplotlib-users mailing list

[hidden email]

https://lists.sourceforge.net/lists/listinfo/matplotlib-users


If you reply to this email, your message will be added to the discussion below:

http://matplotlib.1069221.n5.nabble.com/How-can-I-put-a-white-area-in-the-middle-of-colorbar-showing-the-masked-data-tp42948p42952.html

To start a new topic under matplotlib - users, email [hidden email]

  To unsubscribe from matplotlib, click here.


  [NAML](http://matplotlib.1069221.n5.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html%21nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers%21nabble%3Aemail.naml-instant_emails%21nabble%3Aemail.naml-send_instant_email%21nabble%3Aemail.naml)


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 Eric,

This solved part of my problem. thanks a lot.
I think I will revisit this issue when I have time (not promised).
do you think this could be some feature desirable?

I don't understand what feature you are referring to; evidently I don't understand what the problem is, so I don't know what part remains unsolved.

Eric

···

On 2014/03/02 1:02 AM, ChaoYue wrote:

Cheers,

Chao

On Sat, Mar 1, 2014 at 10:39 PM, Eric Firing [via matplotlib] <[hidden > email] </user/SendEmail.jtp?type=node&node=42956&i=0>> wrote:

    On 2014/03/01 11:03 AM, ChaoYue wrote:
     > The most correct way might be to design a new colormap with white
    color
     > exactly in the middle, however this is very tedious, especially if I
     > want to try
     > different colormaps. so the alternative approach would be to set
    the values
     > falling in (-1,1) as being masked, so they will be the same as
    the axes
     > background color as you mentioned (in our case it's white). My
    question is,
     > how can I put this background color (which shows maksed data) in the
     > colorbar,
     > by avoiding design a new colormap?

    It's not the answer you want to hear, but I think the correct answer is
    that you should do this via the colormap, and not by masking the low
    values. It doesn't have to be painful. If, in contourf, you use a
    diverging colormap with white already in the middle
    (http://matplotlib.org/examples/color/colormaps_reference.html) and a
    norm with symmetric limits (vmin and vmax; you can let them be set
    automatically after you specify your symmetric set of contour
    boundaries
    appropriately) then it will be done for you.

    e.g.,

    z = 10 * np.random.randn(20, 30)
    clevs = [-10, -5, -2, -1, 1, 2, 5, 10]
    cs = plt.contourf(z, levels=clevs, cmap=plt.get_cmap('PRGn'),
                        extend='both')
    cbar = plt.colorbar(cs, spacing='uniform')

    Eric

    ------------------------------------------------------------------------------

Maybe I understand what he means. How can a user override some value in a
colormap? Lets say, in general user wants to inherit some ready made colormap
but in addition wants to force certain colors to some data items.
M.

Eric Firing wrote:

···

On 2014/03/02 1:02 AM, ChaoYue wrote:

Dear Eric,

This solved part of my problem. thanks a lot.
I think I will revisit this issue when I have time (not promised).
do you think this could be some feature desirable?

I don't understand what feature you are referring to; evidently I don't
understand what the problem is, so I don't know what part remains unsolved.

Eric

Cheers,

Chao

On Sat, Mar 1, 2014 at 10:39 PM, Eric Firing [via matplotlib] <[hidden >> email] </user/SendEmail.jtp?type=node&node=42956&i=0>> wrote:

    On 2014/03/01 11:03 AM, ChaoYue wrote:
     > The most correct way might be to design a new colormap with white
    color
     > exactly in the middle, however this is very tedious, especially if I
     > want to try
     > different colormaps. so the alternative approach would be to set
    the values
     > falling in (-1,1) as being masked, so they will be the same as
    the axes
     > background color as you mentioned (in our case it's white). My
    question is,
     > how can I put this background color (which shows maksed data) in the
     > colorbar,
     > by avoiding design a new colormap?

    It's not the answer you want to hear, but I think the correct answer is
    that you should do this via the colormap, and not by masking the low
    values. It doesn't have to be painful. If, in contourf, you use a
    diverging colormap with white already in the middle
    (http://matplotlib.org/examples/color/colormaps_reference.html) and a
    norm with symmetric limits (vmin and vmax; you can let them be set
    automatically after you specify your symmetric set of contour
    boundaries
    appropriately) then it will be done for you.

    e.g.,

    z = 10 * np.random.randn(20, 30)
    clevs = [-10, -5, -2, -1, 1, 2, 5, 10]
    cs = plt.contourf(z, levels=clevs, cmap=plt.get_cmap('PRGn'),
                        extend='both')
    cbar = plt.colorbar(cs, spacing='uniform')

    Eric

    ------------------------------------------------------------------------------

------------------------------------------------------------------------------
Flow-based real-time traffic analytics software. Cisco certified tool.
Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer
Customize your own dashboards, set traffic alerts and generate reports.
Network behavioral analysis & security monitoring. All-in-one tool.
http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users