注意
转到末尾 下载完整的示例代码。
路径效果指南#
定义对象在画布上遵循的路径。
Matplotlib 的 patheffects
模块提供了对任何可以通过 path.Path
渲染的艺术家应用多阶段绘制的功能。
可以应用路径效果的艺术家包括 patches.Patch
、lines.Line2D
、collections.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()
虽然该图看起来与没有路径效果时的预期没有区别,但文本的绘制现在已更改为使用路径效果框架,为更有趣的示例打开了可能性。
添加阴影#
比 Normal
更有趣的路径效果是投影,我们可以将其应用于任何基于路径的艺术家。类 SimplePatchShadow
和 SimpleLineShadow
正是通过在原始艺术家下方绘制填充的补丁或线补丁来实现这一点。
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()
请注意此示例中设置路径效果的两种方法。第一个使用 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()
需要注意的是,这种效果之所以能实现,是因为我们绘制了文本路径两次;一次用粗黑线,然后在上面绘制一次原始文本路径。
您可能已经注意到,Stroke
、SimplePatchShadow
和 SimpleLineShadow
的关键字不是通常的 Artist 关键字(facecolor、edgecolor 等)。这是因为使用这些路径效果,我们在 Matplotlib 的更低级别上操作。实际上,接受的关键字是 matplotlib.backend_bases.GraphicsContextBase
实例的关键字,这些关键字旨在简化创建新后端的过程,而不是用于用户界面。
对路径效果 Artist 的更多控制#
如前所述,一些路径效果在比大多数用户习惯的更低级别上运行,这意味着设置诸如 facecolor 和 edgecolor 之类的关键字会引发 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()