Path effects guide#

Definieren von Pfaden, denen Objekte auf einer Leinwand folgen.

Matplotlibs Modul patheffects bietet die Funktionalität, eine Mehrfachzeichnung auf jeden Künstler anzuwenden, der über einen path.Path gerendert werden kann.

Zu den Künstlern, auf die ein Pfadeffekt angewendet werden kann, gehören patches.Patch, lines.Line2D, collections.Collection und sogar text.Text. Die Pfadeffekte jedes Künstlers können über die Methode Artist.set_path_effects gesteuert werden, die ein Iterable von AbstractPathEffect-Instanzen entgegennimmt.

Der einfachste Pfadeffekt ist der Normal-Effekt, der den Künstler einfach ohne jeglichen Effekt zeichnet.

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

Während die Grafik nicht anders aussieht, als man es ohne Pfadeffekte erwarten würde, wurde die Zeichnung des Textes nun auf das Pfadeffekt-Framework umgestellt, was Möglichkeiten für interessantere Beispiele eröffnet.

Hinzufügen eines Schattens#

Ein weitaus interessanterer Pfadeffekt als Normal ist der Drop-Shadow, den wir auf jeden unserer pfadbasierten Künstler anwenden können. Die Klassen SimplePatchShadow und SimpleLineShadow tun genau dies, indem sie entweder ein gefülltes Patch oder ein Linien-Patch unterhalb des ursprünglichen Künstlers zeichnen.

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

Beachten Sie die beiden Ansätze zum Festlegen der Pfadeffekte in diesem Beispiel. Der erste verwendet die with*-Klassen, um die gewünschte Funktionalität automatisch einzuschließen, gefolgt vom "normalen" Effekt, während der letztere die beiden zu zeichnenden Pfadeffekte explizit definiert.

Einen Künstler hervorheben#

Eine schöne Möglichkeit, Künstler visuell hervorzuheben, ist das Zeichnen einer Umrisslinie in einer kräftigen Farbe unter dem eigentlichen Künstler. Der Pfadeffekt Stroke macht dies zu einer relativ einfachen Aufgabe.

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

Es ist wichtig zu beachten, dass dieser Effekt nur funktioniert, weil wir den Textpfad zweimal gezeichnet haben: einmal mit einer dicken schwarzen Linie und dann wieder mit dem ursprünglichen Textpfad darüber.

Sie haben vielleicht bemerkt, dass die Schlüsselwörter für Stroke und SimplePatchShadow und SimpleLineShadow nicht die üblichen Künstler-Schlüsselwörter sind (facecolor edgecolor, usw.). Das liegt daran, dass wir mit diesen Pfadeffekten auf einer niedrigeren Ebene von Matplotlib arbeiten. Tatsächlich sind die akzeptierten Schlüsselwörter diejenigen einer matplotlib.backend_bases.GraphicsContextBase-Instanz, die dafür konzipiert wurden, die Erstellung neuer Backends zu erleichtern – und nicht für ihre Benutzeroberfläche.

Größere Kontrolle über den Pfadeffekt-Künstler#

Wie bereits erwähnt, arbeiten einige der Pfadeffekte auf einer niedrigeren Ebene, als die meisten Benutzer gewohnt sind, was bedeutet, dass das Festlegen von Schlüsselwörtern wie facecolor und edgecolor einen AttributeError auslöst. Glücklicherweise gibt es einen generischen PathPatchEffect-Pfadeffekt, der eine patches.PathPatch-Klasse mit dem ursprünglichen Pfad erstellt. Die Schlüsselwörter dieses Effekts sind identisch mit denen von 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

Galerie generiert von Sphinx-Gallery