matplotlib 3.5.1

>>> """
================
Anchored Artists
================

This example illustrates the use of the anchored objects without the
helper classes found in :mod:`mpl_toolkits.axes_grid1`. This version
of the figure is similar to the one found in
:doc:`/gallery/axes_grid1/simple_anchored_artists`, but it is
implemented using only the matplotlib namespace, without the help
of additional toolkits.

.. redirect-from:: /gallery/userdemo/anchored_box01
.. redirect-from:: /gallery/userdemo/anchored_box02
.. redirect-from:: /gallery/userdemo/anchored_box03
"""
... 
... from matplotlib import pyplot as plt
... from matplotlib.lines import Line2D
... from matplotlib.patches import Circle, Ellipse
... from matplotlib.offsetbox import (
...  AnchoredOffsetbox, AuxTransformBox, DrawingArea, TextArea, VPacker)
... 
... 
... def draw_text(ax):
...  """Draw a text-box anchored to the upper-left corner of the figure."""
...  box = AnchoredOffsetbox(child=TextArea("Figure 1a"),
...  loc="upper left", frameon=True)
...  box.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")
...  ax.add_artist(box)
... 
... 
... def draw_circles(ax):
...  """Draw circles in axes coordinates."""
...  area = DrawingArea(40, 20, 0, 0)
...  area.add_artist(Circle((10, 10), 10, fc="tab:blue"))
...  area.add_artist(Circle((30, 10), 5, fc="tab:red"))
...  box = AnchoredOffsetbox(
...  child=area, loc="upper right", pad=0, frameon=False)
...  ax.add_artist(box)
... 
... 
... def draw_ellipse(ax):
...  """Draw an ellipse of width=0.1, height=0.15 in data coordinates."""
...  aux_tr_box = AuxTransformBox(ax.transData)
...  aux_tr_box.add_artist(Ellipse((0, 0), width=0.1, height=0.15))
...  box = AnchoredOffsetbox(child=aux_tr_box, loc="lower left", frameon=True)
...  ax.add_artist(box)
... 
... 
... class AnchoredSizeBar(AnchoredOffsetbox):
...  def __init__(self, transform, size, label, loc,
...  pad=0.1, borderpad=0.1, sep=2, prop=None, frameon=True):
...  """ Draw a horizontal bar with the size in data coordinate of the given axes. A label will be drawn underneath (center-aligned). pad, borderpad in fraction of the legend font size (or prop) sep in points. """
...  self.size_bar = AuxTransformBox(transform)
...  self.size_bar.add_artist(Line2D([0, size], [0, 0], color="black"))
...  self.txt_label = TextArea(label)
...  self._box = VPacker(children=[self.size_bar, self.txt_label],
...  align="center",
...  pad=0, sep=sep)
...  super().__init__(loc, pad=pad, borderpad=borderpad,
...  child=self._box, prop=prop, frameon=frameon)
... 
... 
... def draw_sizebar(ax):
...  """ Draw a horizontal bar with length of 0.1 in data coordinates, with a fixed label underneath. """
...  asb = AnchoredSizeBar(ax.transData,
...  0.1,
...  r"1$^{\prime}$",
...  loc='lower center',
...  pad=0.1, borderpad=0.5, sep=5,
...  frameon=False)
...  ax.add_artist(asb)
... 
... 
... fig, ax = plt.subplots()
... ax.set_aspect(1)
... 
... draw_text(ax)
... draw_circles(ax)
... draw_ellipse(ax)
... draw_sizebar(ax)
... 
... plt.show()
...