Einführung
Matplotlib ist eine Diagrammbibliothek für die Programmiersprache Python und ihre numerische Mathematik-Erweiterung NumPy. Eine der Eigenschaften von Matplotlib ist die Fähigkeit, benutzerdefinierte Box-Stile zu erstellen.
In diesem Lab lernen Sie, wie Sie benutzerdefinierte Box-Stile in Matplotlib implementieren. Sie werden lernen, wie Sie einen benutzerdefinierten Box-Stil als Funktion und als Klasse erstellen. Sie werden auch lernen, wie Sie einen benutzerdefinierten Box-Stil bei Matplotlib registrieren.
VM-Tipps
Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu öffnen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.
Implementieren eines benutzerdefinierten Box-Stils als Funktion
Benutzerdefinierte Box-Stile können als Funktionen implementiert werden, die Argumente übergeben bekommen, die sowohl eine rechteckige Box als auch die Größe der „Mutation“ angeben, und den „mutierten“ Pfad zurückgeben. Hier implementieren wir einen benutzerdefinierten Box-Stil, der einen neuen Pfad zurückgibt, der links von der Box eine „Pfeil“-Form hinzufügt.
import matplotlib.pyplot as plt
from matplotlib.patches import BoxStyle
from matplotlib.path import Path
def custom_box_style(x0, y0, width, height, mutation_size):
"""
Gegeben die Position und Größe der Box, gibt den Pfad der Box um sie herum zurück.
Die Rotation wird automatisch übernommen.
Parameter
----------
x0, y0, width, height : float
Box-Position und -Größe.
mutation_size : float
Mutationsreferenzmaßstab, typischerweise die Text-Schriftgröße.
"""
## Padding
mypad = 0.3
pad = mutation_size * mypad
## Breite und Höhe mit hinzugefügtem Padding.
width = width + 2 * pad
height = height + 2 * pad
## Grenze der gepaddeten Box
x0, y0 = x0 - pad, y0 - pad
x1, y1 = x0 + width, y0 + height
## Gebe den neuen Pfad zurück
return Path([(x0, y0),
(x1, y0), (x1, y1), (x0, y1),
(x0-pad, (y0+y1)/2), (x0, y0),
(x0, y0)],
closed=True)
fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
bbox=dict(boxstyle=custom_box_style, alpha=0.2))
plt.show()
Implementieren eines benutzerdefinierten Box-Stils als Klasse
Benutzerdefinierte Box-Stile können auch als Klassen implementiert werden, die __call__ implementieren. Die Klassen können dann in das BoxStyle._style_list-Dict registriert werden, was es ermöglicht, den Box-Stil als Zeichenfolge anzugeben, bbox=dict(boxstyle="registrierter_name,param=value,...",...).
class MyStyle:
"""Eine einfache Box."""
def __init__(self, pad=0.3):
"""
Die Argumente müssen Fließkommazahlen sein und Standardwerte haben.
Parameter
----------
pad : float
Padding-Größe
"""
self.pad = pad
super().__init__()
def __call__(self, x0, y0, width, height, mutation_size):
"""
Gegeben die Position und Größe der Box, gibt den Pfad der Box um sie herum zurück.
Die Rotation wird automatisch übernommen.
Parameter
----------
x0, y0, width, height : float
Box-Position und -Größe.
mutation_size : float
Referenzmaßstab für die Mutation, typischerweise die Text-Schriftgröße.
"""
## Padding
pad = mutation_size * self.pad
## Breite und Höhe mit hinzugefügtem Padding
width = width + 2.*pad
height = height + 2.*pad
## Grenze der gepaddeten Box
x0, y0 = x0 - pad, y0 - pad
x1, y1 = x0 + width, y0 + height
## Gebe den neuen Pfad zurück
return Path([(x0, y0),
(x1, y0), (x1, y1), (x0, y1),
(x0-pad, (y0+y1)/2.), (x0, y0),
(x0, y0)],
closed=True)
BoxStyle._style_list["angled"] = MyStyle ## Registriere den benutzerdefinierten Stil.
fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))
del BoxStyle._style_list["angled"] ## Entregistriere es.
plt.show()
Registrieren des benutzerdefinierten Box-Stils bei Matplotlib
Sobald Sie einen benutzerdefinierten Box-Stil als Klasse implementiert haben, können Sie ihn bei Matplotlib registrieren. Dies ermöglicht es Ihnen, den Box-Stil als Zeichenfolge anzugeben, bbox=dict(boxstyle="registrierter_name,param=value,...",...).
BoxStyle._style_list["angled"] = MyStyle ## Registriere den benutzerdefinierten Stil.
Verwenden des benutzerdefinierten Box-Stils
Sobald Sie einen benutzerdefinierten Box-Stil implementiert und registriert haben, können Sie ihn mit Axes.text verwenden.
fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))
Zusammenfassung
In diesem Lab haben Sie gelernt, wie Sie benutzerdefinierte Box-Stile in Matplotlib implementieren. Sie haben gelernt, wie Sie einen benutzerdefinierten Box-Stil als Funktion und als Klasse erstellen. Sie haben auch gelernt, wie Sie einen benutzerdefinierten Box-Stil bei Matplotlib registrieren und wie Sie ihn mit Axes.text verwenden.