强基初中数学&学Python——第275课 数字和数学第三方模块Matplotlib之八:高级教程——笔迹(Path)特效指南

Path特效指南

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

  Matplotlib的patheffects模块提供了将多重绘制阶段应用于任何艺术家(Artist)的功能,只要这些艺术家可以通过path.Path进行渲染。

  可以应用笔迹特效的艺术家包括patches.Patchlines.Line2Dcollections.Collection甚至text.Text。每个艺术家的笔迹特效都可以通过Artist.set_path_effects方法控制,该方法可以迭代AbstractPathEffect实例。

  最简单的笔迹特效是Normal”特效,它只是在没有任何特效的情况下绘制艺术家:

· 

· 

· 

· 

· 

· 

· 

· 

· 

import matplotlib.pyplot as pltimport 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更有趣的笔迹特效是阴影,我们可以将其应用于任何基于笔迹的艺术家。类SimplePatchShadowSimpleLineShadow通过在原艺术家下方绘制填充补丁(patch)或线条补丁来实现这一点:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import matplotlib.pyplot as pltimport 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*类来设置所需的功能,默认自动伴随“normal”特效,而后者明确定义了要绘制的两个笔迹特效。

浮刻特效

  让艺术家在视觉上有浮刻特效的一个好方法是在实际艺术家下方用黑体画出轮廓。用笔划(Stroke)笔迹特效完成这项任务比较简单:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import matplotlib.pyplot as pltimport matplotlib.patheffects as path_effects
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()

 

  需要注意的是,这种特效之所以有效,是因为我们已经绘制了两次文本笔迹;一次使用粗黑线,然后一次使用顶部的原始文本笔迹。

  您可能已经注意到,StrokeSimplePatchShadowSimpleLineShadow的关键字不是通常的Artist关键字(facecolor、edgecolor等)。这是因为这些笔迹特效在Matplotlib底层中操作。事实上,接受的关键字是matplotlib.backend_bases.GraphicsContextBase实例的关键字,这些关键字是为了方便创建新的后端而设计的,而不是为了它的用户界面。

更好地控制Path特效的艺术家

  如前所述,一些笔迹特效都是在底层操作,这与大多数用户习惯的操作层要低,这导致设置facecolor和edgecolor等关键字会引发AttributeError异常。幸运的是,有一个通用的PathPatchEffect笔迹特效,它使用原始笔迹创建了一个patches.PathPatch类。此特效的关键字与patches.PathPatch的关键字相同:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import matplotlib.pyplot as pltimport matplotlib.patheffects as path_effects
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:https://matplotlib.org/stable/api/patheffects_api.html#module-matplotlib.patheffectspath.Path:https://matplotlib.org/stable/api/path_api.html#matplotlib.path.Pathpatches.Patch:https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.Patch.html#matplotlib.patches.Patchlines.Line2D:https://matplotlib.org/stable/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2Dcollections.Collection:https://matplotlib.org/stable/api/collections_api.html#matplotlib.collections.Collectiontext.Text:https://matplotlib.org/stable/api/text_api.html#matplotlib.text.TextArtist.set_path_effects:https://matplotlib.org/stable/api/_as_gen/matplotlib.artist.Artist.set_path_effects.html#matplotlib.artist.Artist.set_path_effectsAbstractPathEffect:https://matplotlib.org/stable/api/patheffects_api.html#matplotlib.patheffects.AbstractPathEffectNormal:https://matplotlib.org/stable/api/patheffects_api.html#matplotlib.patheffects.NormalSimplePatchShadow:https://matplotlib.org/stable/api/patheffects_api.html#matplotlib.patheffects.SimplePatchShadowSimpleLineShadowhttps://matplotlib.org/stable/api/patheffects_api.html#matplotlib.patheffects.SimpleLineShadowStrokehttps://matplotlib.org/stable/api/patheffects_api.html#matplotlib.patheffects.Strokematplotlib.backend_bases.GraphicsContextBase:
https://matplotlib.org/stable/api/backend_bases_api.html#matplotlib.backend_bases.GraphicsContextBasePathPatchEffect:https://matplotlib.org/stable/api/patheffects_api.html#matplotlib.patheffects.PathPatchEffectpatches.PathPatch:https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.PathPatch.html#matplotlib.patches.PathPatch