简介
Matplotlib 是 Python 中的一个数据可视化库。.inset_locator 功能允许在坐标轴的角落轻松放置插图。在本实验中,我们将探索如何使用 .inset_locator 功能在 Matplotlib 绘图中创建插图。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
创建一个包含两个子图的图形
首先,我们需要创建一个包含两个子图的图形。我们将使用 plt.subplots() 方法来创建一个有两个并排子图的图形。
import matplotlib.pyplot as plt
fig, (ax, ax2) = plt.subplots(1, 2, figsize=[5.5, 2.8])
创建内嵌轴
接下来,我们将在每个子图中创建内嵌轴。我们将使用 inset_axes() 方法来创建内嵌轴。我们将创建四个大小和位置不同的内嵌图。
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
## 创建宽度为 1.3 英寸、高度为 0.9 英寸的内嵌图
## 位于默认的右上角位置
axins = inset_axes(ax, width=1.3, height=0.9)
## 创建宽度为父轴边界框的 30%、高度为 40% 的内嵌图
## 位于左下角(loc=3)
axins2 = inset_axes(ax, width="30%", height="40%", loc=3)
## 在第二个子图中创建混合规格的内嵌图;
## 宽度为父轴边界框的 30%,
## 高度为 1 英寸,位于左上角(loc=2)
axins3 = inset_axes(ax2, width="30%", height=1., loc=2)
## 在右下角(loc=4)创建一个内嵌图,边框填充为 1,即
## 相对于父轴有 10 个点的填充(因为默认字体大小是 10pt)
axins4 = inset_axes(ax2, width="20%", height="20%", loc=4, borderpad=1)
关闭刻度标签
要从每个内嵌图中移除刻度标签,我们可以使用 tick_params() 方法,并将 labelleft 和 labelbottom 设置为 False。
## 关闭内嵌图的刻度标签
for axi in [axins, axins2, axins3, axins4]:
axi.tick_params(labelleft=False, labelbottom=False)
控制内嵌图的位置和大小
我们可以使用 bbox_to_anchor 和 bbox_transform 参数来控制内嵌图的位置和大小。这些参数允许对内嵌图的位置和大小进行细粒度控制,甚至可以将内嵌图定位在完全任意的位置。
## 我们使用坐标轴变换作为 bbox_transform。因此,边界框
## 需要在坐标轴坐标中指定((0, 0) 是坐标轴的左下角,
## (1, 1) 是右上角)。
## 边界框 (.2,.4,.6,.5) 从 (.2,.4) 开始,在这些坐标中延伸到 (.8,.9)。
## 在这个边界框内创建一个宽度为边界框宽度一半、
## 高度为边界框高度四分之三的内嵌图。内嵌图的左下角
## 与边界框的左下角对齐(loc=3)。
## 然后,内嵌图以默认的字体大小单位 0.5 进行偏移。
axins = inset_axes(ax, width="50%", height="75%",
bbox_to_anchor=(.2,.4,.6,.5),
bbox_transform=ax.transAxes, loc=3)
创建具有任意位置的内嵌图
我们可以通过使用 bbox_to_anchor 参数在数据坐标中指定一个边界框,并使用 bbox_transform 参数指定边界框的变换,来创建具有任意位置的内嵌图。
## 使用 ax.transData 作为变换在数据坐标中创建内嵌图
axins3 = inset_axes(ax2, width="100%", height="100%",
bbox_to_anchor=(1e-2, 2, 1e3, 3),
bbox_transform=ax2.transData, loc=2, borderpad=0)
在坐标轴外部创建内嵌图
我们可以通过使用 bbox_to_anchor 参数在坐标轴坐标中指定一个延伸到坐标轴外部的边界框,从而在坐标轴外部创建一个内嵌图。
## 在坐标轴外部创建一个内嵌图
axins = inset_axes(ax, width="100%", height="100%",
bbox_to_anchor=(1.05,.6,.5,.4),
bbox_transform=ax.transAxes, loc=2, borderpad=0)
使用二元组边界框创建内嵌图
通过以英寸为单位指定宽度和高度,并使用 bbox_to_anchor 参数指定内嵌图的左下角,我们可以创建一个具有二元组边界框的内嵌图。
## 使用二元组边界框创建一个内嵌图。请注意,这会创建一个
## 没有范围的边界框。因此,只有在以绝对单位(英寸)指定
## 宽度和高度时才有意义。
axins2 = inset_axes(ax, width=0.5, height=0.4,
bbox_to_anchor=(0.33, 0.25),
bbox_transform=ax.transAxes, loc=3, borderpad=0)
在图形坐标中创建居中的内嵌图
通过使用 blended_transform_factory() 方法创建一个混合变换,并将其用作 bbox_transform 参数,我们可以创建一个在内嵌图在图形坐标中水平居中且垂直方向与坐标轴对齐的内嵌图。
## 创建一个在内嵌图在图形坐标中水平居中且垂直方向
## 与坐标轴对齐的内嵌图。
from matplotlib.transforms import blended_transform_factory
transform = blended_transform_factory(fig.transFigure, ax2.transAxes)
axins4 = inset_axes(ax2, width="16%", height="34%",
bbox_to_anchor=(0, 0, 1, 1),
bbox_transform=transform, loc=8, borderpad=0)
总结
在本实验中,我们学习了如何使用 Matplotlib 中的.inset_locator功能在绘图中创建内嵌图。我们创建了具有不同大小和位置的内嵌图,控制了内嵌图的位置和大小,并创建了具有任意位置的内嵌图。我们还在坐标轴外部创建了内嵌图、具有二元组边界框的内嵌图以及在图形坐标中居中的内嵌图。