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

Appearance settings

Commit 3dd84b7

Browse filesBrowse files
Fix inset_axes + doc
1 parent 5daabdd commit 3dd84b7
Copy full SHA for 3dd84b7

File tree

Expand file treeCollapse file tree

4 files changed

+284
-73
lines changed
Filter options
Expand file treeCollapse file tree

4 files changed

+284
-73
lines changed

‎examples/axes_grid1/inset_locator_demo.py

Copy file name to clipboardExpand all lines: examples/axes_grid1/inset_locator_demo.py
+126-30Lines changed: 126 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,145 @@
44
==================
55
66
"""
7+
8+
###############################################################################
9+
# The `.inset_locator`'s `~.inset_axes` allows to easily place insets in the
10+
# corners of the axes by specifying a width and height and optionally
11+
# a location (loc) which accepts locations as codes, similar to
12+
# `~matplotlib.axes.Axes.legend`.
13+
# By default, the inset is offset by some points from the axes - this is
14+
# controlled via the `borderpad` parameter.
15+
716
import matplotlib.pyplot as plt
17+
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
18+
19+
20+
fig, (ax, ax2) = plt.subplots(1, 2, figsize=[5.5, 2.8])
21+
22+
# Create inset of width 1.3 inches and height 0.9 inches
23+
# at the default upper right location
24+
axins = inset_axes(ax, width=1.3, height=0.9)
25+
26+
# Create inset of width 30% and height 40% of the parent axes' bounding box
27+
# at the lower left corner (loc=3)
28+
axins2 = inset_axes(ax, width="30%", height="40%", loc=3)
29+
30+
# Create inset of mixed specifications in the second subplot;
31+
# width is 30% of parent axes' bounding box and
32+
# height is 1 inch at the upper left corner (loc=2)
33+
axins3 = inset_axes(ax2, width="30%", height=1., loc=2)
34+
35+
# Create an inset in the lower right corner (loc=4) with borderpad=1, i.e.
36+
# 10 points padding (as 10pt is the default fontsize) to the parent axes
37+
axins4 = inset_axes(ax2, width="20%", height="20%", loc=4, borderpad=1)
38+
39+
# Turn ticklabels of insets off
40+
for axi in [axins, axins2, axins3, axins4]:
41+
axi.tick_params(labelleft=False, labelbottom=False)
42+
43+
#plt.show()
44+
45+
46+
###############################################################################
47+
# The arguments `bbox_to_anchor` and `bbox_transfrom` can be used for a more
48+
# fine grained control over the inset position and size or even to position
49+
# the inset at completely aribtrary positions.
50+
# The `bbox_to_anchor` sets the bounding box in coordinates according to the
51+
# `bbox_transform`.
52+
#
853

9-
from mpl_toolkits.axes_grid1.inset_locator import inset_axes, zoomed_inset_axes
10-
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar
54+
fig = plt.figure(figsize=[5.5, 2.8])
55+
ax = fig.add_subplot(121)
1156

57+
# We use the axes transform as bbox_transform. Therefore the bounding box
58+
# needs to be specified in axes coordinates ((0,0) is the lower left corner
59+
# of the axes, (1,1) is the upper right corner).
60+
# The bounding box (.2, .4, .6, .5) starts at (.2,.4) and ranges to (.8,.9)
61+
# in those coordinates.
62+
# Inside of this bounding box an inset of half the bounding box' width and
63+
# three quarters of the bounding box' height is created. The lower left corner
64+
# of the inset is aligned to the lower left corner of the bounding box (loc=3).
65+
# The inset is then offset by the default 0.5 in units of the font size.
1266

13-
def add_sizebar(ax, size):
14-
asb = AnchoredSizeBar(ax.transData,
15-
size,
16-
str(size),
17-
loc=8,
18-
pad=0.1, borderpad=0.5, sep=5,
19-
frameon=False)
20-
ax.add_artist(asb)
67+
axins = inset_axes(ax, width="50%", height="75%",
68+
bbox_to_anchor=(.2, .4, .6, .5),
69+
bbox_transform=ax.transAxes, loc=3)
2170

71+
# For visualization purposes we mark the bounding box by a rectangle
72+
ax.add_patch(plt.Rectangle((.2, .4), .6, .5, ls="--", ec="c", fc="None",
73+
transform=ax.transAxes))
2274

23-
fig, (ax, ax2) = plt.subplots(1, 2, figsize=[5.5, 3])
75+
# We set the axis limits to something other than the default, in order to not
76+
# distract from the fact that axes coodinates are used here.
77+
ax.axis([0, 10, 0, 10])
2478

25-
# first subplot
26-
ax.set_aspect(1)
2779

28-
axins = inset_axes(ax,
29-
width="30%", # width = 30% of parent_bbox
30-
height=1., # height : 1 inch
31-
loc=3)
80+
# Note how the two following insets are created at the same positions, one by
81+
# use of the default parent axes' bbox and the other via a bbox in axes
82+
# coordinates and the respective transform.
83+
ax2 = fig.add_subplot(222)
84+
axins2 = inset_axes(ax2, width="30%", height="50%")
3285

33-
plt.xticks(visible=False)
34-
plt.yticks(visible=False)
86+
ax3 = fig.add_subplot(224)
87+
axins3 = inset_axes(ax3, width="100%", height="100%",
88+
bbox_to_anchor=(.7, .5, .3, .5),
89+
bbox_transform=ax3.transAxes)
3590

91+
# For visualization purposes we mark the bounding box by a rectangle
92+
ax2.add_patch(plt.Rectangle((0, 0), 1, 1, ls="--", lw=2, ec="c", fc="None"))
93+
ax3.add_patch(plt.Rectangle((.7, .5), .3, .5, ls="--", lw=2,
94+
ec="c", fc="None"))
3695

37-
# second subplot
38-
ax2.set_aspect(1)
96+
# Turn ticklabels off
97+
for axi in [axins2, axins3, ax2, ax3]:
98+
axi.tick_params(labelleft=False, labelbottom=False)
3999

40-
axins = zoomed_inset_axes(ax2, zoom=0.5, loc='upper right')
41-
# fix the number of ticks on the inset axes
42-
axins.yaxis.get_major_locator().set_params(nbins=7)
43-
axins.xaxis.get_major_locator().set_params(nbins=7)
100+
#plt.show()
44101

45-
plt.xticks(visible=False)
46-
plt.yticks(visible=False)
47102

48-
add_sizebar(ax2, 0.5)
49-
add_sizebar(axins, 0.5)
103+
###############################################################################
104+
# In the above the axes transform together with 4-tuple bounding boxes has been
105+
# used as it mostly is useful to specify an inset relative to the axes it is
106+
# an inset to. However other use cases are equally possible. The following
107+
# example examines some of those.
108+
#
109+
110+
fig = plt.figure(figsize=[5.5, 2.8])
111+
ax = fig.add_subplot(131)
112+
113+
# Create an inset outside the axes
114+
axins = inset_axes(ax, width="100%", height="100%",
115+
bbox_to_anchor=(1.05, .6, .5, .4),
116+
bbox_transform=ax.transAxes, loc=2, borderpad=0)
117+
axins.tick_params(left=False, right=True, labelleft=False, labelright=True)
118+
119+
# Create an inset with a 2-tuple bounding box. Note that this creates a
120+
# bbox without extent. This hence only makes sense when specifying
121+
# width and height in absolute units (inches).
122+
axins2 = inset_axes(ax, width=0.5, height=0.4,
123+
bbox_to_anchor=(0.33, 0.25),
124+
bbox_transform=ax.transAxes, loc=3, borderpad=0)
125+
126+
127+
ax2 = fig.add_subplot(133)
128+
ax2.set_xscale("log")
129+
ax2.axis([1e-6, 1e6, -2, 6])
130+
131+
# Create inset in data coordinates using ax.transData as transform
132+
axins3 = inset_axes(ax2, width="100%", height="100%",
133+
bbox_to_anchor=(1e-2, 2, 1e3, 3),
134+
bbox_transform=ax2.transData, loc=2, borderpad=0)
135+
136+
# Create an inset horizontally centered in figure coordinates and vertically
137+
# bound to line up with the axes.
138+
from matplotlib.transforms import blended_transform_factory
139+
transform = blended_transform_factory(fig.transFigure, ax2.transAxes)
140+
axins4 = inset_axes(ax2, width="16%", height="34%",
141+
bbox_to_anchor=(0, 0, 1, 1),
142+
bbox_transform=transform, loc=8, borderpad=0)
50143

51-
plt.draw()
52144
plt.show()
145+
146+
147+
148+

‎examples/axes_grid1/inset_locator_demo2.py

Copy file name to clipboardExpand all lines: examples/axes_grid1/inset_locator_demo2.py
+45-15Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,16 @@
33
Inset Locator Demo2
44
===================
55
6+
This Demo shows how to create a zoomed inset via `~.zoomed_inset_axes`.
7+
In the first subplot an `~.AnchoredSizeBar` shows the zoom effect.
8+
In the second subplot a connection to the region of interest is
9+
created via `~.mark_inset`.
610
"""
11+
712
import matplotlib.pyplot as plt
813

9-
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes
10-
from mpl_toolkits.axes_grid1.inset_locator import mark_inset
14+
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes, mark_inset
15+
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredSizeBar
1116

1217
import numpy as np
1318

@@ -20,36 +25,61 @@ def get_demo_image():
2025
# z is a numpy array of 15x15
2126
return z, (-3, 4, -4, 3)
2227

23-
fig, ax = plt.subplots(figsize=[5, 4])
28+
fig, (ax, ax2) = plt.subplots(ncols=2, figsize=[6, 3])
29+
30+
31+
# First subplot, showing an inset with a size bar.
32+
ax.set_aspect(1)
33+
34+
axins = zoomed_inset_axes(ax, zoom=0.5, loc='upper right')
35+
# fix the number of ticks on the inset axes
36+
axins.yaxis.get_major_locator().set_params(nbins=7)
37+
axins.xaxis.get_major_locator().set_params(nbins=7)
2438

25-
# prepare the demo image
39+
plt.setp(axins.get_xticklabels(), visible=False)
40+
plt.setp(axins.get_yticklabels(), visible=False)
41+
42+
def add_sizebar(ax, size):
43+
asb = AnchoredSizeBar(ax.transData,
44+
size,
45+
str(size),
46+
loc=8,
47+
pad=0.1, borderpad=0.5, sep=5,
48+
frameon=False)
49+
ax.add_artist(asb)
50+
51+
add_sizebar(ax, 0.5)
52+
add_sizebar(axins, 0.5)
53+
54+
55+
# Second subplot, showing an image with an inset zoom
56+
# and a marked inset
2657
Z, extent = get_demo_image()
2758
Z2 = np.zeros([150, 150], dtype="d")
2859
ny, nx = Z.shape
2960
Z2[30:30 + ny, 30:30 + nx] = Z
3061

3162
# extent = [-3, 4, -4, 3]
32-
ax.imshow(Z2, extent=extent, interpolation="nearest",
63+
ax2.imshow(Z2, extent=extent, interpolation="nearest",
3364
origin="lower")
3465

35-
axins = zoomed_inset_axes(ax, 6, loc=1) # zoom = 6
36-
axins.imshow(Z2, extent=extent, interpolation="nearest",
66+
axins2 = zoomed_inset_axes(ax2, 6, loc=1) # zoom = 6
67+
axins2.imshow(Z2, extent=extent, interpolation="nearest",
3768
origin="lower")
3869

3970
# sub region of the original image
4071
x1, x2, y1, y2 = -1.5, -0.9, -2.5, -1.9
41-
axins.set_xlim(x1, x2)
42-
axins.set_ylim(y1, y2)
72+
axins2.set_xlim(x1, x2)
73+
axins2.set_ylim(y1, y2)
4374
# fix the number of ticks on the inset axes
44-
axins.yaxis.get_major_locator().set_params(nbins=7)
45-
axins.xaxis.get_major_locator().set_params(nbins=7)
75+
axins2.yaxis.get_major_locator().set_params(nbins=7)
76+
axins2.xaxis.get_major_locator().set_params(nbins=7)
4677

47-
plt.xticks(visible=False)
48-
plt.yticks(visible=False)
78+
plt.setp(axins2.get_xticklabels(), visible=False)
79+
plt.setp(axins2.get_yticklabels(), visible=False)
4980

5081
# draw a bbox of the region of the inset axes in the parent axes and
5182
# connecting lines between the bbox and the inset axes area
52-
mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="0.5")
83+
mark_inset(ax2, axins2, loc1=2, loc2=4, fc="none", ec="0.5")
5384

54-
plt.draw()
5585
plt.show()

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.