Position colorbar inside figure
One may use a mpl_toolkits.axes_grid1.inset_locator.inset_axes
to place an axes inside another axes. This axes can be used to host the colorbar. Its position is relative the the parent axes, similar to how legends are placed, using a loc
argument (e.g. loc=3
means lower left). Its width and height can be specified in absolute numbers (inches) or relative to the parent axes (percentage).
cbaxes = inset_axes(ax1, width="30%", height="3%", loc=3)
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
x = np.random.randn(60)
y = np.random.randn(60)
z = [np.random.random() for _ in range(60)]
fig = plt.figure()
gs = gridspec.GridSpec(1, 2)
ax0 = plt.subplot(gs[0, 0])
plt.scatter(x, y, s=20)
ax1 = plt.subplot(gs[0, 1])
cm = plt.cm.get_cmap('RdYlBu_r')
plt.scatter(x, y, s=20 ,c=z, cmap=cm)
fig.tight_layout()
cbaxes = inset_axes(ax1, width="30%", height="3%", loc=3)
plt.colorbar(cax=cbaxes, ticks=[0.,1], orientation='horizontal')
plt.show()
Note that in order to suppress the warning, one might simply call tight_layout
prior to adding the inset axes.
Gabriel
Updated on June 09, 2022Comments
-
Gabriel almost 2 years
I have a simple scatter plot where each point has a color given by a value between 0 and 1 set to a chosen colormap. Here's a
MWE
of my code:import matplotlib.pyplot as plt import numpy as np import matplotlib.gridspec as gridspec x = np.random.randn(60) y = np.random.randn(60) z = [np.random.random() for _ in range(60)] fig = plt.figure() gs = gridspec.GridSpec(1, 2) ax0 = plt.subplot(gs[0, 0]) plt.scatter(x, y, s=20) ax1 = plt.subplot(gs[0, 1]) cm = plt.cm.get_cmap('RdYlBu_r') plt.scatter(x, y, s=20 ,c=z, cmap=cm) cbaxes = fig.add_axes([0.6, 0.12, 0.1, 0.02]) plt.colorbar(cax=cbaxes, ticks=[0.,1], orientation='horizontal') fig.tight_layout() plt.show()
which looks like this:
The problem here is that I want the small horizontal colorbar position to the lower left of the plot but using the
cax
argument not only feels a bit hacky, it apparently conflicts withtight_layout
which results in the warning:/usr/local/lib/python2.7/dist-packages/matplotlib/figure.py:1533: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect. warnings.warn("This figure includes Axes that are not "
Isn't there a better way to position the colorbar, ie without getting a nasty warning thrown at you whenever you run the code?
Edit
I wanted the colorbar to show only the max and min values, ie: 0 and 1 and Joe helped me do that by adding
vmin=0, vmax=1
toscatter
like so:plt.scatter(x, y, s=20, vmin=0, vmax=1)
so I'm removing this part of the question.
-
Gabriel almost 7 yearsOther than the convenience of locating the axis using
loc
instead of manually selecting the coordinates (which is indeed convenient), is there any other advantage over usingfig.add_axes()
? -
ImportanceOfBeingErnest almost 7 yearsNo, not having to worry about the coodinates is the advantage. In this simple case it may not be too obvious, but in the general case you may not even know the coordinates at which you would need to place the axes using
add_axes
, whileinset_axes
makes sure the axes is inside the other axes and positionned relative to it.