在 Matplotlib 中创建 BboxImage

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,你将学习如何在 Matplotlib 中创建一个 BboxImage。BboxImage 可用于根据边界框定位图像。我们将展示如何创建带有文本的 BboxImage 以及如何为每个颜色映射创建 BboxImage。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入必要的库

我们首先导入本教程所需的必要库。我们将需要matplotlib.pyplotnumpyBboxImageBboxTransformedBbox

import matplotlib.pyplot as plt
import numpy as np

from matplotlib.image import BboxImage
from matplotlib.transforms import Bbox, TransformedBbox

创建带文本的 BboxImage

我们首先创建一个带文本的 BboxImage。我们使用text()方法创建一个text对象,并将其添加到ax1对象中。然后,我们使用add_artist()方法创建一个BboxImage对象。我们将text对象的get_window_extent方法传递给BboxImage构造函数,以获取文本的边界框。我们还将形状为 (1, 256) 的一维数组传递给BboxImage构造函数的data参数,以创建一个图像。

fig, (ax1, ax2) = plt.subplots(ncols=2)

txt = ax1.text(0.5, 0.5, "test", size=30, ha="center", color="w")
ax1.add_artist(
    BboxImage(txt.get_window_extent, data=np.arange(256).reshape((1, -1))))

为每个颜色映射创建一个 BboxImage

接下来,我们为每个颜色映射创建一个 BboxImage。我们首先使用plt.colormaps方法创建一个所有颜色映射的列表。然后,我们创建一个for循环,遍历颜色映射列表。对于每个颜色映射,我们使用divmod()方法计算ixiy位置。然后,我们使用Bbox.from_bounds()方法创建一个Bbox对象。我们将ixiydxdy值传递给Bbox.from_bounds()方法以创建边界框。然后,我们使用Bbox对象和ax2.transAxes对象创建一个TransformedBbox对象。最后,我们使用add_artist()方法创建一个BboxImage对象。我们将TransformedBbox对象传递给BboxImage构造函数,以创建一个带有颜色映射的图像。

cmap_names = sorted(m for m in plt.colormaps if not m.endswith("_r"))

ncol = 2
nrow = len(cmap_names) // ncol + 1

xpad_fraction = 0.3
dx = 1 / (ncol + xpad_fraction * (ncol - 1))

ypad_fraction = 0.3
dy = 1 / (nrow + ypad_fraction * (nrow - 1))

for i, cmap_name in enumerate(cmap_names):
    ix, iy = divmod(i, nrow)
    bbox0 = Bbox.from_bounds(ix*dx*(1+xpad_fraction),
                             1 - iy*dy*(1+ypad_fraction) - dy,
                             dx, dy)
    bbox = TransformedBbox(bbox0, ax2.transAxes)
    ax2.add_artist(
        BboxImage(bbox, cmap=cmap_name, data=np.arange(256).reshape((1, -1))))

显示绘图

最后,我们使用show()方法显示绘图。

plt.show()

总结

在本实验中,你学习了如何在 Matplotlib 中创建 BboxImage。我们创建了一个带文本的 BboxImage 以及为每个颜色映射创建了一个 BboxImage。你可以运用这些知识来创建具有不同边界框和颜色映射的图像。