Matplotlib 简明教程

Matplotlib - Anchored Artists

在 Matplotlib 中, Artist 是表示绘图中几乎所有组件的基本对象。无论是线、文本、轴还是任何其他图形元素,Matplotlib 绘图中的所有内容都是 Artist 的实例或从 Artist 类派生而来。

Anchored Artists 是自定义 artist 的特殊类型,可以锚定到绘图上的特定位置。它们可用于添加注释、箭头和其他锚定在特定点或区域上的自定义元素。

请参见下面的参考示例 −

anchored artists intro

在上图中,您可以观察到文本框、圆环和大小栏被固定在绘图上的特定位置。

Anchored Artists in Matplotlib

在 Matplotlib 中有两个提供固定化对象的模块,分别是 −

  1. Matplotlib.offsetbox

  2. Mpl_toolkits.axes_grid1.anchored_artists

The matplotlib.offsetbox module

此模块提供了 AnchoredOffsetboxAnchoredText 类,允许您相对于父轴或特定锚点固定任意的对象或文本。它们可用于更通用的注释和修饰。

现在,我们使用 matplotlib.offsetbox 模块中的 AnchoredText 类在绘图上的特定位置实现两个 anchored text boxes

import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredText

# Create a figure and axis
fig, ax = plt.subplots(figsize=(7, 4))

# Anchored Text Box 1
at = AnchoredText("Anchored text-box 1",
   loc='upper left', prop=dict(size=10), frameon=True)
at.patch.set_boxstyle("round,pad=0.,rounding_size=0.2")
ax.add_artist(at)

# Anchored Text Box 2
at2 = AnchoredText("Anchored text-box 2",
   loc='center', prop=dict(size=16), frameon=True,
   bbox_to_anchor=(0.5, 0.5),
   bbox_transform=ax.transAxes)
at2.patch.set_boxstyle("round,pad=0.,rounding_size=0.5")
ax.add_artist(at2)

# Display the plot
plt.show()

执行上述代码,我们将得到以下输出 −

anchored artists ex1

The mpl_toolkits.axes_grid1.anchored_artists module

此模块提供了 AnchoredDirectionArrowsAnchoredAuxTransformBoxAnchoredDrawingAreaAnchoredSizeBar 等特殊固定化对象。该类的每一个都用于不同的目的。

我们来看每个类的用法 −

  1. AnchoredAuxTransformBox − 一个具有转换坐标的固定化容器。

  2. AnchoredDirectionArrows − 绘制两个垂直箭头以指示方向。

  3. AnchoredDrawingArea − 一个具有固定大小和可填充绘图区域的固定化容器。

  4. AnchoredSizeBar − 绘制带有居中对齐标签的水平刻度条。

本示例演示如何使用 AnchoredDirectionArrows 类将视觉上吸引人的固定化方向箭头添加到 Matplotlib 绘图。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.font_manager as fm
from mpl_toolkits.axes_grid1.anchored_artists import AnchoredDirectionArrows

np.random.seed(19680801)

fig, ax = plt.subplots(figsize=(7, 4))
ax.imshow(np.random.random((10, 10)))

# Rotated arrow
fontprops = fm.FontProperties(family='serif')

rotated_arrow = AnchoredDirectionArrows(
   ax.transAxes,
   '30', '120',
   loc='center',
   color='w',
   angle=30,
   fontproperties=fontprops
)
ax.add_artist(rotated_arrow)

plt.show()

执行上述代码,我们将得到以下输出 −

anchored artists ex2