fixed colorbar position for repeated plots

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

fixed colorbar position for repeated plots

Heiland, Randy
I have a script that lets a user step through and plot data in files and I want to fix the position, i.e. re-use, a single colorbar. How is this done? The following script illustrates the problem:

# adapted from https://matplotlib.org/examples/pylab_examples/colorbar_tick_labelling_demo.html
import matplotlib.pyplot as plt
import numpy as np
from numpy.random import randn

fig, ax = plt.subplots()
data = np.clip(randn(250, 250), -1, 1)
cax = ax.imshow(data, interpolation='nearest')
cbar = fig.colorbar(cax, ticks=[-1, 0, 1])

data = np.clip(randn(250, 250), -1, 1)
cax = ax.imshow(data, interpolation='nearest')
cbar = fig.colorbar(cax, ticks=[-1, 0, 1])

plt.show()

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: fixed colorbar position for repeated plots

Saito Kotaro (PSI)
Dear Randy,

This might works.

-------------
fig, ax = plt.subplots()

# first time
data = np.clip(randn(250, 250), -1, 1)
img = ax.imshow(data, interpolation='nearest')
cbar = fig.colorbar(img, ticks=[-1, 0, 1])

# second time, reusing colorbar axis
data = 2*data
img = ax.imshow(data, interpolation='nearest')
cbar = fig.colorbar(img, cax=cbar.ax, ticks=[-1, 0, 1])

plt.show()
-------------

If you don’t specify cax, fig.colorbar automatically rip out a part of space used by original ax for new Axes object where Colorbar object sits in.
https://matplotlib.org/api/_as_gen/matplotlib.pyplot.colorbar.html
That is why your code produce two colorbars.

I also modified some object names in your code.
There are many inappropriate colorbar examples which mix up object names such as cbar, cax and img.
ax.imshow returns AxesImage object and fig.colorbar make a colorbar from this AxesImage. That is why I name it img, not cax.
Then, first fig.colorbar rips out a space from the original Axes, make a new Axes for colorbar, instantiates, puts and returns a Colorbar object.
https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.colorbar
Colorbar object knows Axes object for itself (cbar.ax in my code). You can insert a line ”cax = cbar.ax" before second fig.colorbar and use “cax=cax”.

"2*data" in second plotting part is just to show that the second colorbar is properly produced without making new Axes.

Best regards,

Kotaro

//================//================//
Paul Scherrer Institut
Kotaro SAITO 斉藤耕太郎
Laboratory for Neutron Scattering and Imaging
WHGA/348
5232 Villigen PSI, Schweiz
+41 56 310 3179
[hidden email]
https://sites.google.com/view/kotarosaito/
//================//================//

> On 2018/5/ 8, at 17:28, Heiland, Randy <[hidden email]> wrote:
>
> I have a script that lets a user step through and plot data in files and I want to fix the position, i.e. re-use, a single colorbar. How is this done? The following script illustrates the problem:
>
> # adapted from https://matplotlib.org/examples/pylab_examples/colorbar_tick_labelling_demo.html
> import matplotlib.pyplot as plt
> import numpy as np
> from numpy.random import randn
>
> fig, ax = plt.subplots()
> data = np.clip(randn(250, 250), -1, 1)
> cax = ax.imshow(data, interpolation='nearest')
> cbar = fig.colorbar(cax, ticks=[-1, 0, 1])
>
> data = np.clip(randn(250, 250), -1, 1)
> cax = ax.imshow(data, interpolation='nearest')
> cbar = fig.colorbar(cax, ticks=[-1, 0, 1])
>
> plt.show()
>
> _______________________________________________
> Matplotlib-users mailing list
> [hidden email]
> https://mail.python.org/mailman/listinfo/matplotlib-users

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users
Reply | Threaded
Open this post in threaded view
|

Re: fixed colorbar position for repeated plots

Heiland, Randy
Thanks Kotaro! That does indeed seem to be what I needed.

Randy

> On May 8, 2018, at 12:14 PM, Saito Kotaro (PSI) <[hidden email]> wrote:
>
> Dear Randy,
>
> This might works.
>
> -------------
> fig, ax = plt.subplots()
>
> # first time
> data = np.clip(randn(250, 250), -1, 1)
> img = ax.imshow(data, interpolation='nearest')
> cbar = fig.colorbar(img, ticks=[-1, 0, 1])
>
> # second time, reusing colorbar axis
> data = 2*data
> img = ax.imshow(data, interpolation='nearest')
> cbar = fig.colorbar(img, cax=cbar.ax, ticks=[-1, 0, 1])
>
> plt.show()
> -------------
>
> If you don’t specify cax, fig.colorbar automatically rip out a part of space used by original ax for new Axes object where Colorbar object sits in.
> https://matplotlib.org/api/_as_gen/matplotlib.pyplot.colorbar.html
> That is why your code produce two colorbars.
>
> I also modified some object names in your code.
> There are many inappropriate colorbar examples which mix up object names such as cbar, cax and img.
> ax.imshow returns AxesImage object and fig.colorbar make a colorbar from this AxesImage. That is why I name it img, not cax.
> Then, first fig.colorbar rips out a space from the original Axes, make a new Axes for colorbar, instantiates, puts and returns a Colorbar object.
> https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.colorbar
> Colorbar object knows Axes object for itself (cbar.ax in my code). You can insert a line ”cax = cbar.ax" before second fig.colorbar and use “cax=cax”.
>
> "2*data" in second plotting part is just to show that the second colorbar is properly produced without making new Axes.
>
> Best regards,
>
> Kotaro
>
> //================//================//
> Paul Scherrer Institut
> Kotaro SAITO 斉藤耕太郎
> Laboratory for Neutron Scattering and Imaging
> WHGA/348
> 5232 Villigen PSI, Schweiz
> +41 56 310 3179
> [hidden email]
> https://sites.google.com/view/kotarosaito/
> //================//================//
>
>> On 2018/5/ 8, at 17:28, Heiland, Randy <[hidden email]> wrote:
>>
>> I have a script that lets a user step through and plot data in files and I want to fix the position, i.e. re-use, a single colorbar. How is this done? The following script illustrates the problem:
>>
>> # adapted from https://matplotlib.org/examples/pylab_examples/colorbar_tick_labelling_demo.html
>> import matplotlib.pyplot as plt
>> import numpy as np
>> from numpy.random import randn
>>
>> fig, ax = plt.subplots()
>> data = np.clip(randn(250, 250), -1, 1)
>> cax = ax.imshow(data, interpolation='nearest')
>> cbar = fig.colorbar(cax, ticks=[-1, 0, 1])
>>
>> data = np.clip(randn(250, 250), -1, 1)
>> cax = ax.imshow(data, interpolation='nearest')
>> cbar = fig.colorbar(cax, ticks=[-1, 0, 1])
>>
>> plt.show()
>>
>> _______________________________________________
>> Matplotlib-users mailing list
>> [hidden email]
>> https://mail.python.org/mailman/listinfo/matplotlib-users
>

_______________________________________________
Matplotlib-users mailing list
[hidden email]
https://mail.python.org/mailman/listinfo/matplotlib-users