Benutzerdefinierte Box-Stile in Matplotlib

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

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.