路徑效果指南#

定義物件在畫布上追蹤的路徑。

Matplotlib 的 patheffects 模組提供了對任何可透過 path.Path 渲染的 Artist 應用多重繪製階段的功能。

可套用路徑效果的 Artist 包括 patches.Patchlines.Line2Dcollections.Collection,甚至 text.Text。每個 Artist 的路徑效果都可以透過 Artist.set_path_effects 方法控制,該方法接受一個 AbstractPathEffect 實例的可迭代物件。

最簡單的路徑效果是 Normal 效果,它只是在不進行任何效果的情況下繪製 Artist

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 更有趣的路徑效果是陰影,我們可以將其應用於任何基於路徑的 Artist。SimplePatchShadowSimpleLineShadow 類別正是透過在原始 Artist 下方繪製填滿的 Patch 或線條 Patch 來實現此目的

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* 類別自動包含所需功能,然後是「正常」效果,而後者則明確定義要繪製的兩種路徑效果。

使 Artist 突出顯示#

使 Artist 在視覺上突出的一種不錯的方法是在實際 Artist 下方以粗體顏色繪製輪廓。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 關鍵字 (facecoloredgecolor 等)。這是因為透過這些路徑效果,我們在 Matplotlib 的較低層級進行操作。事實上,接受的關鍵字是 matplotlib.backend_bases.GraphicsContextBase 實例的關鍵字,這些關鍵字旨在方便建立新的後端,而不是其使用者介面。

更佳地控制路徑效果 Artist#

如前所述,某些路徑效果的運作層級低於大多數使用者習慣的層級,這表示設定 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 產生的圖庫