Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Positioning the colorbar

I have a matplotlib plot with a colorbar attached. I want to position the colorbar so that it is horizontal, and underneath my plot.

I have almost done this via the following:

plt.colorbar(orientation="horizontal",fraction=0.07,anchor=(1.0,0.0)) 

But the colorbar is still overlapping with the plot slightly (and the labels of the x axis). I want to move the colorbar further down, but I can't figure out how to do it.

like image 399
user1551817 Avatar asked Nov 09 '12 15:11

user1551817


People also ask

How do I set the position bar color?

To move the colorbar to a different tile, set the Layout property of the colorbar. To display the colorbar in a location that does not appear in the table, use the Position property to specify a custom location. If you set the Position property, then MATLAB sets the Location property to 'manual' .

How do you add a Colorbar in Python?

To make colorbar orientation horizontal in Python, we can use orientation="horizontal" in the argument.

How do you make one Colorbar for all subplots in Python?

To have one color bar for all subplots with Python, we can use matplotlib's subplots_adjust and colorbar methods. to call subplots_adjust on the fig subplot with the right argument to adjust the position of the subplots.


2 Answers

using padding pad

In order to move the colorbar relative to the subplot, one may use the pad argument to fig.colorbar.

import matplotlib.pyplot as plt import numpy as np; np.random.seed(1)  fig, ax = plt.subplots(figsize=(4,4)) im = ax.imshow(np.random.rand(11,16)) ax.set_xlabel("x label")  fig.colorbar(im, orientation="horizontal", pad=0.2) plt.show() 

enter image description here

using an axes divider

One can use an instance of make_axes_locatable to divide the axes and create a new axes which is perfectly aligned to the image plot. Again, the pad argument would allow to set the space between the two axes.

import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable import numpy as np; np.random.seed(1)  fig, ax = plt.subplots(figsize=(4,4)) im = ax.imshow(np.random.rand(11,16)) ax.set_xlabel("x label")  divider = make_axes_locatable(ax) cax = divider.new_vertical(size="5%", pad=0.7, pack_start=True) fig.add_axes(cax) fig.colorbar(im, cax=cax, orientation="horizontal")  plt.show() 

enter image description here

using subplots

One can directly create two rows of subplots, one for the image and one for the colorbar. Then, setting the height_ratios as gridspec_kw={"height_ratios":[1, 0.05]} in the figure creation, makes one of the subplots much smaller in height than the other and this small subplot can host the colorbar.

import matplotlib.pyplot as plt import numpy as np; np.random.seed(1)  fig, (ax, cax) = plt.subplots(nrows=2,figsize=(4,4),                    gridspec_kw={"height_ratios":[1, 0.05]}) im = ax.imshow(np.random.rand(11,16)) ax.set_xlabel("x label")  fig.colorbar(im, cax=cax, orientation="horizontal")  plt.show() 

enter image description here

like image 110
ImportanceOfBeingErnest Avatar answered Oct 18 '22 09:10

ImportanceOfBeingErnest


Edit: Updated for matplotlib version >= 3.

Three great ways to do this have already been shared in this answer.

The matplotlib documentation advises to use inset_locator. This would work as follows:

import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import inset_axes import numpy as np  rng = np.random.default_rng(1)  fig, ax = plt.subplots(figsize=(4,4)) im = ax.imshow(rng.random((11, 16))) ax.set_xlabel("x label")  axins = inset_axes(ax,                     width="100%",                       height="5%",                     loc='lower center',                     borderpad=-5                    ) fig.colorbar(im, cax=axins, orientation="horizontal") 

code output

like image 27
turnerm Avatar answered Oct 18 '22 10:10

turnerm