Skip to content

Commit ab94dd7

Browse files
jklymakrcomer
andcommitted
DOC: add a couple more placement examples, crosslink axes_grid [ci doc]
Co-authored-by: Ruth Comer <10599679+rcomer@users.noreply.github.com>
1 parent 8fc7da4 commit ab94dd7

File tree

4 files changed

+118
-15
lines changed

4 files changed

+118
-15
lines changed

galleries/examples/axes_grid1/demo_colorbar_with_axes_divider.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
"""
2+
.. _demo-colorbar-with-axes-divider:
3+
24
=========================
35
Colorbar with AxesDivider
46
=========================
@@ -8,6 +10,10 @@
810
method of the `.AxesDivider` can then be used to create a new axes on a given
911
side ("top", "right", "bottom", or "left") of the original axes. This example
1012
uses `.append_axes` to add colorbars next to axes.
13+
14+
Users should consider simply passing the main axes to the *ax* keyword argument of
15+
`~.Figure.colorbar` instead of creating a locatable axes manually like this.
16+
See :ref:`colorbar_placement`.
1117
"""
1218

1319
import matplotlib.pyplot as plt

galleries/examples/axes_grid1/demo_colorbar_with_inset_locator.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
"""
2+
.. _demo-colorbar-with-inset-locator:
3+
24
==============================================================
35
Controlling the position and size of colorbars with Inset Axes
46
==============================================================
57
6-
This example shows how to control the position, height, and width of
7-
colorbars using `~mpl_toolkits.axes_grid1.inset_locator.inset_axes`.
8+
This example shows how to control the position, height, and width of colorbars
9+
using `~mpl_toolkits.axes_grid1.inset_locator.inset_axes`.
810
911
Inset axes placement is controlled as for legends: either by providing a *loc*
1012
option ("upper right", "best", ...), or by providing a locator with respect to
1113
the parent bbox. Parameters such as *bbox_to_anchor* and *borderpad* likewise
1214
work in the same way, and are also demonstrated here.
15+
16+
Users should consider using `.Axes.inset_axes` instead (see
17+
:ref:`colorbar_placement`).
18+
1319
"""
1420

1521
import matplotlib.pyplot as plt

galleries/users_explain/axes/colorbar_placement.py

Lines changed: 102 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
Colorbars indicate the quantitative extent of image data. Placing in
1111
a figure is non-trivial because room needs to be made for them.
1212
13-
The simplest case is just attaching a colorbar to each axes:
13+
Automatic placement of colorbars
14+
================================
15+
16+
The simplest case is just attaching a colorbar to each axes. Note in this
17+
example that the colorbars steal some space from the parent axes.
1418
"""
1519
import matplotlib.pyplot as plt
1620
import numpy as np
@@ -28,9 +32,9 @@
2832
fig.colorbar(pcm, ax=ax)
2933

3034
# %%
31-
# The first column has the same type of data in both rows, so it may
32-
# be desirable to combine the colorbar which we do by calling
33-
# `.Figure.colorbar` with a list of axes instead of a single axes.
35+
# The first column has the same type of data in both rows, so it may be
36+
# desirable to have just one colorbar. We do this by passing `.Figure.colorbar`
37+
# a list of axes with the *ax* kwarg.
3438

3539
fig, axs = plt.subplots(2, 2)
3640
cmaps = ['RdBu_r', 'viridis']
@@ -41,6 +45,27 @@
4145
cmap=cmaps[col])
4246
fig.colorbar(pcm, ax=axs[:, col], shrink=0.6)
4347

48+
# %%
49+
# The stolen space can lead to axes in the same subplot layout
50+
# being different sizes, which is often undesired if the the
51+
# x-axis on each plot is meant to be comparable as in the following:
52+
53+
fig, axs = plt.subplots(2, 1, figsize=(4, 5), sharex=True)
54+
X = np.random.randn(20, 20)
55+
axs[0].plot(np.sum(X, axis=0))
56+
axs[1].pcolormesh(X)
57+
fig.colorbar(pcm, ax=axs[1], shrink=0.6)
58+
59+
# %%
60+
# This is usually undesired, and can be worked around in various ways, e.g.
61+
# adding a colorbar to the other axes and then removing it. However, the most
62+
# straightforward is to use :ref:`constrained layout <constrainedlayout_guide>`:
63+
64+
fig, axs = plt.subplots(2, 1, figsize=(4, 5), sharex=True, layout='constrained')
65+
axs[0].plot(np.sum(X, axis=0))
66+
axs[1].pcolormesh(X)
67+
fig.colorbar(pcm, ax=axs[1], shrink=0.6)
68+
4469
# %%
4570
# Relatively complicated colorbar layouts are possible using this
4671
# paradigm. Note that this example works far better with
@@ -56,8 +81,67 @@
5681
fig.colorbar(pcm, ax=[axs[2, 1]], location='left')
5782

5883
# %%
59-
# Colorbars with fixed-aspect-ratio axes
60-
# ======================================
84+
# Adjusting the spacing between colorbars and parent axes
85+
# =======================================================
86+
#
87+
# The distance a colorbar is from the parent axes can be adjusted with the
88+
# *pad* keyword argument. This is in units of fraction of the parent axes
89+
# width, and the default for a vertical axes is 0.05 (or 0.15 for a horizontal
90+
# axes).
91+
92+
fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(5, 5))
93+
for ax, pad in zip(axs, [0.025, 0.05, 0.1]):
94+
pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
95+
fig.colorbar(pcm, ax=ax, pad=pad, label=f'pad: {pad}')
96+
fig.suptitle("layout='constrained'")
97+
98+
# %%
99+
# Note that if you do not use constrained layout, the pad command makes the
100+
# parent axes shrink:
101+
102+
fig, axs = plt.subplots(3, 1, figsize=(5, 5))
103+
for ax, pad in zip(axs, [0.025, 0.05, 0.1]):
104+
pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
105+
fig.colorbar(pcm, ax=ax, pad=pad, label=f'pad: {pad}')
106+
fig.suptitle("No layout manager")
107+
108+
# %%
109+
# Manual placement of colorbars
110+
# =============================
111+
#
112+
# Sometimes the automatic placement provided by ``colorbar`` does not
113+
# give the desired effect. We can manually create an axes and tell
114+
# ``colorbar`` to use that axes by passing the axes to the *cax* keyword
115+
# argument.
116+
#
117+
# Using ``inset_axes``
118+
# --------------------
119+
#
120+
# We can manually create any type of axes for the colorbar to use, but an
121+
# `.Axes.inset_axes` is useful because it is a child of the parent axes and can
122+
# be positioned relative to the parent. Here we add a colorbar centered near
123+
# the bottom of the parent axes.
124+
125+
fig, ax = plt.subplots(layout='constrained', figsize=(4, 4))
126+
pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
127+
ax.set_ylim([-4, 20])
128+
cax = ax.inset_axes([0.3, 0.07, 0.4, 0.04])
129+
fig.colorbar(pcm, cax=cax, orientation='horizontal')
130+
131+
# %%
132+
# `.Axes.inset_axes` can also specify its position in data coordinates
133+
# using the *transform* keyword argument if you want your axes at a
134+
# certain data position on the graph:
135+
136+
fig, ax = plt.subplots(layout='constrained', figsize=(4, 4))
137+
pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
138+
ax.set_ylim([-4, 20])
139+
cax = ax.inset_axes([7.5, -1.7, 5, 1.2], transform=ax.transData)
140+
fig.colorbar(pcm, cax=cax, orientation='horizontal')
141+
142+
# %%
143+
# Colorbars attached to fixed-aspect-ratio axes
144+
# ---------------------------------------------
61145
#
62146
# Placing colorbars for axes with a fixed aspect ratio pose a particular
63147
# challenge as the parent axes changes size depending on the data view.
@@ -77,9 +161,10 @@
77161
fig.colorbar(pcm, ax=ax, shrink=0.6)
78162

79163
# %%
80-
# One way around this issue is to use an `.Axes.inset_axes` to locate the
81-
# axes in axes coordinates. Note that if you zoom in on the axes, and
82-
# change the shape of the axes, the colorbar will also change position.
164+
# We solve this problem using `.Axes.inset_axes` to locate the axes in "axes
165+
# coordinates" (see :ref:`transforms_tutorial`). Note that if you zoom in on
166+
# the parent axes, and thus change the shape of it, the colorbar will also
167+
# change position.
83168

84169
fig, axs = plt.subplots(2, 2, layout='constrained')
85170
cmaps = ['RdBu_r', 'viridis']
@@ -94,6 +179,12 @@
94179
ax.set_aspect(1/2)
95180
if row == 1:
96181
cax = ax.inset_axes([1.04, 0.2, 0.05, 0.6])
97-
fig.colorbar(pcm, ax=ax, cax=cax)
182+
fig.colorbar(pcm, cax=cax)
98183

99-
plt.show()
184+
# %%
185+
# .. seealso::
186+
#
187+
# :ref:`axes_grid` has methods for manually creating colorbar axes as well:
188+
#
189+
# - :ref:`demo-colorbar-with-inset-locator`
190+
# - :ref:`demo-colorbar-with-axes-divider`

galleries/users_explain/axes/constrainedlayout_guide.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
55
.. _constrainedlayout_guide:
66
7-
================================
7+
========================
88
Constrained Layout Guide
9-
================================
9+
========================
1010
1111
Use *constrained layout* to fit plots within your figure cleanly.
1212

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy