Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitcc76e51

Browse files
story645timhoffm
andcommitted
breakup annotationbbox demo and add annotationbbox to annotation guide
Co-authored-by: Tim Hoffmann <2836374+timhoffm@users.noreply.github.com>
1 parentc01eb01 commitcc76e51

File tree

2 files changed

+131
-51
lines changed

2 files changed

+131
-51
lines changed
Lines changed: 87 additions & 50 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 useofAnnotationBbox together with three different
9-
OffsetBoxes: `.TextArea`, `.DrawingArea`, and `.OffsetImage`.
2+
======================
3+
Artists as annotations
4+
======================
5+
6+
`.AnnotationBbox`facilitates annotating parts of the figure or axes using arbitrary
7+
artists, such as texts, images, and `matplotlib.patches`. `.AnnotationBbox` supports
8+
these artists via inputs that are subclassesof`.OffsetBox`, which is a class of
9+
container artists for positioning an artist relative to a parent artist.
1010
"""
1111

1212
importmatplotlib.pyplotasplt
@@ -15,57 +15,60 @@
1515
frommatplotlib.cbookimportget_sample_data
1616
frommatplotlib.offsetboximport (AnnotationBbox,DrawingArea,OffsetImage,
1717
TextArea)
18-
frommatplotlib.patchesimportCircle
18+
frommatplotlib.patchesimportAnnulus,Circle,ConnectionPatch
1919

20-
fig,ax=plt.subplots()
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, which allows it to be used for
27+
# annotating figure objects. The `.annotate` method should be used when annotating an
28+
# axes element (such as a plot) with text.
29+
#
30+
fig,axd=plt.subplot_mosaic([['t1','.','t2']],layout='compressed')
2131

2232
# Define a 1st position to annotate (display it with a marker)
23-
xy= (0.5,0.7)
24-
ax.plot(xy[0],xy[1],".r")
25-
26-
# Annotate the 1st position with a text box ('Test 1')
33+
xy1= (.25,.75)
34+
xy2= (.75,.25)
35+
axd['t1'].plot(*xy1,".r")
36+
axd['t2'].plot(*xy2,".r")
37+
axd['t1'].set(xlim=(0,1),ylim=(0,1),aspect='equal')
38+
axd['t2'].set(xlim=(0,1),ylim=(0,1),aspect='equal')
39+
# Draw an arrow between the points
40+
41+
c=ConnectionPatch(xyA=xy1,xyB=xy2,
42+
coordsA=axd['t1'].transData,coordsB=axd['t2'].transData,
43+
arrowstyle='->')
44+
fig.add_artist(c)
45+
46+
# Annotate the ConnectionPatch position ('Test 1')
2747
offsetbox=TextArea("Test 1")
2848

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)
49+
ab1=AnnotationBbox(offsetbox,(.5,.5),
50+
xybox=(0,0),
51+
xycoords=c,
52+
boxcoords="offset points",
53+
arrowprops=dict(arrowstyle="->"),
54+
bboxprops=dict(boxstyle="sawtooth"))
55+
fig.add_artist(ab1)
3656

37-
# Annotate the 1st position with another text box ('Test')
38-
offsetbox=TextArea("Test")
57+
# %%%%
58+
# Images
59+
# ======
60+
# The `.OffsetImage` container supports plotting images. `.OffsetImage` accepts many of
61+
# the same parameters as other image plotting methods, such as *cmap*, *norm*, and
62+
# *interpolation*.
3963

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)
4764

48-
# Define a 2nd position to annotate (don't display with a marker this time)
65+
fig,ax=plt.subplots()
66+
# Define a position to annotate (don't display with a marker)
4967
xy= [0.3,0.55]
5068

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)
55-
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)
65-
66-
# Annotate the 2nd position with an image (a generated array of pixels)
69+
# Annotate a position with an image generated from an array of pixels
6770
arr=np.arange(100).reshape((10,10))
68-
im=OffsetImage(arr,zoom=2)
71+
im=OffsetImage(arr,zoom=2,cmap='viridis')
6972
im.image.axes=ax
7073

7174
ab=AnnotationBbox(im,xy,
@@ -74,10 +77,9 @@
7477
boxcoords="offset points",
7578
pad=0.3,
7679
arrowprops=dict(arrowstyle="->"))
77-
7880
ax.add_artist(ab)
7981

80-
# Annotate the2ndposition with another image (a Grace Hopper portrait)
82+
# Annotate the position with another image (a Grace Hopper portrait)
8183
withget_sample_data("grace_hopper.jpg")asfile:
8284
arr_img=plt.imread(file)
8385

@@ -102,6 +104,38 @@
102104

103105
plt.show()
104106

107+
# %%%%
108+
# Arbitrary Artists
109+
# ================
110+
#
111+
# Multiple and arbitrary artists can be placed inside a `.DrawingArea`.
112+
113+
114+
fig,ax=plt.subplots()
115+
# Define a position to annotate (don't display with a marker)
116+
xy= [0.3,0.55]
117+
118+
# Annotate the position with a circle and annulus
119+
da=DrawingArea(30,30,0,0)
120+
p=Circle((10,10),10,color='C0')
121+
da.add_artist(p)
122+
q=Annulus((20,20),10,5,color='C1')
123+
da.add_artist(q)
124+
125+
126+
# Use the drawing area as an annotation
127+
ab=AnnotationBbox(da,xy,
128+
xybox=(.75,xy[1]),
129+
xycoords='data',
130+
boxcoords=("axes fraction","data"),
131+
box_alignment=(0.2,0.5),
132+
arrowprops=dict(arrowstyle="->"),
133+
bboxprops=dict(alpha=0.5))
134+
135+
ax.add_artist(ab)
136+
plt.show()
137+
#
138+
105139
# %%
106140
#
107141
# .. admonition:: References
@@ -117,3 +151,6 @@
117151
# - `matplotlib.cbook.get_sample_data`
118152
# - `matplotlib.pyplot.subplots`
119153
# - `matplotlib.pyplot.imread`
154+
#
155+
# .. tags::
156+
# 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+
frommatplotlib.offsetboximportAnnotationBbox,DrawingArea,OffsetImage
708+
frommatplotlib.patchesimportAnnulus
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,1,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)

[8]ページ先頭

©2009-2025 Movatter.jp