Skip to content

Commit 04e428f

Browse files
committed
breakup annotationbbox demo and add annotationbbox to annotation guide
1 parent c01eb01 commit 04e428f

File tree

2 files changed

+119
-45
lines changed

2 files changed

+119
-45
lines changed
Lines changed: 75 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
"""
2-
===================
3-
AnnotationBbox demo
4-
===================
5-
6-
`.AnnotationBbox` creates an annotation using an `.OffsetBox`, and
7-
provides more fine-grained control than `.Axes.annotate`. This example
8-
demonstrates the use of AnnotationBbox together with three different
9-
OffsetBoxes: `.TextArea`, `.DrawingArea`, and `.OffsetImage`.
2+
======================
3+
Artists as annotations
4+
======================
5+
6+
`.AnnotationBbox` creates an annotation using an `.OffsetBox` object, which is a class
7+
of container artists for positioning an artist relative to a parent artist. This allows
8+
for annotations that are texts, images, and arbitrary artists. `.AnnotationBbox` also
9+
provides more fine-grained control than `.Axes.annotate`.
1010
"""
1111

1212
import matplotlib.pyplot as plt
@@ -15,8 +15,16 @@
1515
from matplotlib.cbook import get_sample_data
1616
from matplotlib.offsetbox import (AnnotationBbox, DrawingArea, OffsetImage,
1717
TextArea)
18-
from matplotlib.patches import Circle
18+
from matplotlib.patches import Annulus, Circle
1919

20+
# %%%%
21+
# Text
22+
# ====
23+
#
24+
# `.AnnotationBbox` supports positioning annotations relative to data, Artists, and
25+
# callables, as described in :ref:`annotations`. The `.TextArea` is used to create a
26+
# textbox that is not explicitly attached to an axes.
27+
#
2028
fig, ax = plt.subplots()
2129

2230
# Define a 1st position to annotate (display it with a marker)
@@ -26,46 +34,37 @@
2634
# Annotate the 1st position with a text box ('Test 1')
2735
offsetbox = TextArea("Test 1")
2836

29-
ab = AnnotationBbox(offsetbox, xy,
30-
xybox=(-20, 40),
31-
xycoords='data',
32-
boxcoords="offset points",
33-
arrowprops=dict(arrowstyle="->"),
34-
bboxprops=dict(boxstyle="sawtooth"))
35-
ax.add_artist(ab)
37+
ab1 = AnnotationBbox(offsetbox, xy,
38+
xybox=(-20, 40),
39+
xycoords='data',
40+
boxcoords="offset points",
41+
arrowprops=dict(arrowstyle="->"),
42+
bboxprops=dict(boxstyle="sawtooth"))
43+
ax.add_artist(ab1)
3644

3745
# Annotate the 1st position with another text box ('Test')
38-
offsetbox = TextArea("Test")
39-
40-
ab = AnnotationBbox(offsetbox, xy,
41-
xybox=(1.02, xy[1]),
42-
xycoords='data',
43-
boxcoords=("axes fraction", "data"),
44-
box_alignment=(0., 0.5),
45-
arrowprops=dict(arrowstyle="->"))
46-
ax.add_artist(ab)
46+
offsetbox = TextArea("Test 2")
4747

48-
# Define a 2nd position to annotate (don't display with a marker this time)
49-
xy = [0.3, 0.55]
48+
ab2 = AnnotationBbox(offsetbox, (1, .85),
49+
xybox=(.75, xy[1]),
50+
xycoords=ab1,
51+
boxcoords=("axes fraction", "data"),
52+
box_alignment=(0., 0.5),
53+
arrowprops=dict(arrowstyle="->"))
54+
ax.add_artist(ab2)
5055

51-
# Annotate the 2nd position with a circle patch
52-
da = DrawingArea(20, 20, 0, 0)
53-
p = Circle((10, 10), 10)
54-
da.add_artist(p)
56+
# %%%%
57+
# Images
58+
# ======
59+
# The `.OffsetImage` container supports plotting images using `.BboxImage`
5560

56-
ab = AnnotationBbox(da, xy,
57-
xybox=(1., xy[1]),
58-
xycoords='data',
59-
boxcoords=("axes fraction", "data"),
60-
box_alignment=(0.2, 0.5),
61-
arrowprops=dict(arrowstyle="->"),
62-
bboxprops=dict(alpha=0.5))
63-
64-
ax.add_artist(ab)
61+
fig, ax = plt.subplots()
62+
# Define a position to annotate (don't display with a marker)
63+
xy = [0.3, 0.55]
6564

66-
# Annotate the 2nd position with an image (a generated array of pixels)
65+
# Annotate a position with an image generated from an array of pixels
6766
arr = np.arange(100).reshape((10, 10))
68-
im = OffsetImage(arr, zoom=2)
67+
im = OffsetImage(arr, zoom=2, cmap='viridis')
6968
im.image.axes = ax
7069

7170
ab = AnnotationBbox(im, xy,
@@ -74,10 +73,9 @@
7473
boxcoords="offset points",
7574
pad=0.3,
7675
arrowprops=dict(arrowstyle="->"))
77-
7876
ax.add_artist(ab)
7977

80-
# Annotate the 2nd position with another image (a Grace Hopper portrait)
78+
# Annotate the position with another image (a Grace Hopper portrait)
8179
with get_sample_data("grace_hopper.jpg") as file:
8280
arr_img = plt.imread(file)
8381

@@ -102,6 +100,36 @@
102100

103101
plt.show()
104102

103+
# %%%%
104+
# Arbitrary Artists
105+
# ================
106+
# `.DrawingArea` artists position arbitrary artists relative to their parent artists.
107+
108+
fig, ax = plt.subplots()
109+
# Define a position to annotate (don't display with a marker)
110+
xy = [0.3, 0.55]
111+
112+
# Annotate the position with a circle and annulus
113+
da = DrawingArea(30, 30, 0, 0)
114+
p = Circle((10, 10), 10, color='C0')
115+
da.add_artist(p)
116+
q = Annulus((20, 20), 10, 5, color='C1')
117+
da.add_artist(q)
118+
119+
120+
# Use the drawing area as an annotation
121+
ab = AnnotationBbox(da, xy,
122+
xybox=(.75, xy[1]),
123+
xycoords='data',
124+
boxcoords=("axes fraction", "data"),
125+
box_alignment=(0.2, 0.5),
126+
arrowprops=dict(arrowstyle="->"),
127+
bboxprops=dict(alpha=0.5))
128+
129+
ax.add_artist(ab)
130+
plt.show()
131+
#
132+
105133
# %%
106134
#
107135
# .. admonition:: References
@@ -117,3 +145,6 @@
117145
# - `matplotlib.cbook.get_sample_data`
118146
# - `matplotlib.pyplot.subplots`
119147
# - `matplotlib.pyplot.imread`
148+
#
149+
# .. tags::
150+
# component: annotation, styling: position

galleries/users_explain/text/annotations.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,11 +691,54 @@ def __call__(self, x0, y0, width, height, mutation_size):
691691

692692
ax.add_artist(anchored_box)
693693
fig.subplots_adjust(top=0.8)
694-
695694
# %%
696695
# Note that, unlike in `.Legend`, the ``bbox_transform`` is set to
697696
# `.IdentityTransform` by default
698697
#
698+
# .. _annotations-bbox:
699+
#
700+
# Using an Artist as an annotation
701+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
702+
# `.AnnotationBbox` uses `.OffsetBox` artists as the annotations and supports
703+
# positioning these annotations in the same was the other annotation methods.
704+
# For more examples, see
705+
# :doc:`/gallery/text_labels_and_annotations/demo_annotation_box`
706+
707+
from matplotlib.offsetbox import AnnotationBbox, DrawingArea, OffsetImage
708+
from matplotlib.patches import Annulus
709+
710+
fig, ax = plt.subplots()
711+
712+
text = ax.text(.2, .8, "Green!", color='green')
713+
714+
da = DrawingArea(20, 20, 0, 0)
715+
annulus = Annulus((10, 10), 10, 5, color='tab:green')
716+
da.add_artist(annulus)
717+
718+
# position annulus relative to text
719+
ab1 = AnnotationBbox(da, (.5, 0),
720+
xybox=(.5, .25),
721+
xycoords=text,
722+
boxcoords=(text, "data"),
723+
arrowprops=dict(arrowstyle="->"),
724+
bboxprops=dict(alpha=0.5))
725+
ax.add_artist(ab1)
726+
727+
N = 25
728+
arr = np.repeat(np.linspace(0, 10, N), N).reshape(N, N)
729+
im = OffsetImage(arr, cmap='Greens')
730+
im.image.axes = ax
731+
732+
# position gradient relative to text and annulus
733+
ab2 = AnnotationBbox(im, xy=(.5, 0),
734+
xybox=(.75, 0),
735+
xycoords=text,
736+
boxcoords=('data', annulus),
737+
arrowprops=dict(arrowstyle="->"),
738+
bboxprops=dict(alpha=0.5))
739+
ax.add_artist(ab2)
740+
741+
# %%%%
699742
# .. _annotating_coordinate_systems:
700743
#
701744
# Coordinate systems for annotations

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