路径效果指南#

定义对象在画布上遵循的路径。

Matplotlib 的 patheffects 模块提供了对任何可以通过 path.Path 渲染的 Artist 应用多重绘制阶段的功能。

可以应用路径效果的艺术家包括 patches.Patchlines.Line2Dcollections.Collection 甚至 text.Text。每个艺术家的路径效果可以通过 Artist.set_path_effects 方法来控制,该方法接受一个 AbstractPathEffect 实例的可迭代对象。

最简单的路径效果是 Normal 效果,它只是简单地绘制艺术家,没有任何效果:

import matplotlib.pyplot as plt

import matplotlib.patheffects as path_effects

fig = plt.figure(figsize=(5, 1.5))
text = fig.text(0.5, 0.5, 'Hello path effects world!\nThis is the normal '
                          'path effect.\nPretty dull, huh?',
                ha='center', va='center', size=20)
text.set_path_effects([path_effects.Normal()])
plt.show()
patheffects guide

虽然这个图看起来和你在没有路径效果的情况下预期的没有什么不同,但现在文本的绘制已经改为使用路径效果框架,为更有趣的例子打开了可能性。

添加阴影#

Normal 更有趣的路径效果是投影效果,我们可以将其应用于任何基于路径的艺术家。SimplePatchShadowSimpleLineShadow 类正是通过在原始艺术家下方绘制填充块或线条块来实现这一点:

import matplotlib.patheffects as path_effects

text = plt.text(0.5, 0.5, 'Hello path effects world!',
                path_effects=[path_effects.withSimplePatchShadow()])

plt.plot([0, 3, 2, 5], linewidth=5, color='blue',
         path_effects=[path_effects.SimpleLineShadow(),
                       path_effects.Normal()])
plt.show()
patheffects guide

注意在这个例子中设置路径效果的两种方法。第一种使用 with* 类来自动包含所需的功能,然后跟随“正常”效果,而后者则明确地定义了两个路径效果来绘制。

让艺术家脱颖而出#

让艺术家在视觉上脱颖而出的一个好方法是,在实际艺术家下方用粗颜色绘制一个轮廓。Stroke 路径效果使这项任务变得相对简单:

fig = plt.figure(figsize=(7, 1))
text = fig.text(0.5, 0.5, 'This text stands out because of\n'
                          'its black border.', color='white',
                          ha='center', va='center', size=30)
text.set_path_effects([path_effects.Stroke(linewidth=3, foreground='black'),
                       path_effects.Normal()])
plt.show()
patheffects guide

需要注意的是,这种效果之所以有效,是因为我们绘制了两次文本路径;一次是用粗黑线,然后在上面绘制原始文本路径。

你可能已经注意到,StrokeSimplePatchShadowSimpleLineShadow 的关键词不是通常的 Artist 关键词(facecolor edgecolor 等)。这是因为对于这些路径效果,我们是在 Matplotlib 的较低层次上操作。实际上,所接受的关键词是 matplotlib.backend_bases.GraphicsContextBase 实例的那些,这些关键词是为了方便创建新的后端而设计的——而不是为了其用户界面。

路径效果艺术家的更大控制#

如前所述,一些路径效果的操作级别低于大多数用户所习惯的级别,这意味着设置诸如 facecoloredgecolor 这样的关键字会引发 AttributeError。幸运的是,有一个通用的 PathPatchEffect 路径效果,它使用原始路径创建一个 patches.PathPatch 类。此效果的关键字与 patches.PathPatch 的关键字相同:

fig = plt.figure(figsize=(8.5, 1))
t = fig.text(0.02, 0.5, 'Hatch shadow', fontsize=75, weight=1000, va='center')
t.set_path_effects([
    path_effects.PathPatchEffect(
        offset=(4, -4), hatch='xxxx', facecolor='gray'),
    path_effects.PathPatchEffect(
        edgecolor='white', linewidth=1.1, facecolor='black')])
plt.show()
patheffects guide

由 Sphinx-Gallery 生成的图库