Anpassen von Matplotlib-Legenden

MatplotlibMatplotlibBeginner
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

In diesem Lab werden wir untersuchen, wie man Legenden in Matplotlib erstellt und anpasst. Legenden werden verwendet, um die Bedeutung der Elemente in einem Diagramm zu erklären, einschließlich von Linien, Balken und Markern. Wir werden demonstrieren, wie man Legenden für bestimmte Linien, komplexe Beschriftungen und komplexere Diagramme erstellt. Schließlich werden wir zeigen, wie man benutzerdefinierte Klassen schreibt, um Legenden zu stylisieren.

VM-Tipps

Nachdem die VM gestartet ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der 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, und wir werden das Problem für Sie prompt beheben.

Legende für bestimmte Linien erstellen

In diesem Schritt werden wir eine Legende für bestimmte Linien erstellen.

## Import notwendige Bibliotheken
import matplotlib.pyplot as plt
import numpy as np

## Definiere Daten für das Diagramm
t1 = np.arange(0.0, 2.0, 0.1)
t2 = np.arange(0.0, 2.0, 0.01)

## Erstelle ein Diagramm mit mehreren Linien
fig, ax = plt.subplots()
l1, = ax.plot(t2, np.exp(-t2))
l2, l3 = ax.plot(t2, np.sin(2 * np.pi * t2), '--o', t1, np.log(1 + t1), '.')
l4, = ax.plot(t2, np.exp(-t2) * np.sin(2 * np.pi * t2),'s-.')

## Erstelle eine Legende für zwei der Linien
ax.legend((l2, l4), ('oszillierend', 'gedämpft'), loc='upper right', shadow=True)

## Füge Beschriftungen und Titel zum Diagramm hinzu
ax.set_xlabel('Zeit')
ax.set_ylabel('Spannung')
ax.set_title('Gedämpfte Schwingung')

## Zeige das Diagramm an
plt.show()

Komplexere Beschriftungen plotten

In diesem Schritt werden wir komplexere Beschriftungen plotten.

## Definiere Daten für das Diagramm
x = np.linspace(0, 1)

## Erstelle ein Diagramm mit mehreren Linien
fig, (ax0, ax1) = plt.subplots(2, 1)
for n in range(1, 5):
    ax0.plot(x, x**n, label=f"{n=}")

## Erstelle eine Legende mit mehreren Spalten und einem Titel
leg = ax0.legend(loc="upper left", bbox_to_anchor=[0, 1],
                 ncols=2, shadow=True, title="Legende", fancybox=True)
leg.get_title().set_color("rot")

## Erstelle ein Diagramm mit mehreren Linien und Markern
ax1.plot(x, x**2, label="mehrere\nLinien")
half_pi = np.linspace(0, np.pi / 2)
ax1.plot(np.sin(half_pi), np.cos(half_pi), label=r"$\frac{1}{2}\pi$")
ax1.plot(x, 2**(x**2), label="$2^{x^2}$")

## Erstelle eine Legende mit einer Schatteneffekt
ax1.legend(shadow=True, fancybox=True)

## Zeige das Diagramm an
plt.show()

Legenden an komplexere Diagramme anfügen

In diesem Schritt werden wir Legenden an komplexere Diagramme anfügen.

## Definiere Daten für das Diagramm
fig, axs = plt.subplots(3, 1, layout="constrained")
top_ax, middle_ax, bottom_ax = axs

## Erstelle ein Balkendiagramm mit mehreren Balken
top_ax.bar([0, 1, 2], [0.2, 0.3, 0.1], width=0.4, label="Balken 1",
           align="center")
top_ax.bar([0.5, 1.5, 2.5], [0.3, 0.2, 0.2], color="rot", width=0.4,
           label="Balken 2", align="center")
top_ax.legend()

## Erstelle ein Fehlerbalkendiagramm mit mehreren Fehlern
middle_ax.errorbar([0, 1, 2], [2, 3, 1], xerr=0.4, fmt="s", label="test 1")
middle_ax.errorbar([0, 1, 2], [3, 2, 4], yerr=0.3, fmt="o", label="test 2")
middle_ax.errorbar([0, 1, 2], [1, 1, 3], xerr=0.4, yerr=0.3, fmt="^",
                   label="test 3")
middle_ax.legend()

## Erstelle ein Stabdiagramm mit einer Legende
bottom_ax.stem([0.3, 1.5, 2.7], [1, 3.6, 2.7], label="Stabtest")
bottom_ax.legend()

## Zeige das Diagramm an
plt.show()

Legendentext mit mehr als einem Legendenzeichen erstellen

In diesem Schritt werden wir Legendentext mit mehr als einem Legendenzeichen erstellen.

## Definiere Daten für das Diagramm
fig, (ax1, ax2) = plt.subplots(2, 1, layout='constrained')
p1 = ax1.scatter([1], [5], c='r', marker='s', s=100)
p2 = ax1.scatter([3], [2], c='b', marker='o', s=100)
p3, = ax1.plot([1, 5], [4, 4],'m-d')

## Erstelle eine Legende mit zwei Zeichen für einen Eintrag
l = ax1.legend([(p1, p3), p2], ['zwei Zeichen', 'ein Zeichen'], scatterpoints=1,
               numpoints=1, handler_map={tuple: HandlerTuple(ndivide=None)})

## Erstelle zwei Balkendiagramme übereinander und ändere den Abstand zwischen den Legendenzeichen
x_left = [1, 2, 3]
y_pos = [1, 3, 2]
y_neg = [2, 1, 4]
rneg = ax2.bar(x_left, y_neg, width=0.5, color='w', hatch='///', label='-1')
rpos = ax2.bar(x_left, y_pos, width=0.5, color='k', label='+1')

## Behandle jeden Legendentext unterschiedlich, indem du spezifische `HandlerTuple`s verwendest
l = ax2.legend([(rpos, rneg), (rneg, rpos)], ['pad!=0', 'pad=0'],
               handler_map={(rpos, rneg): HandlerTuple(ndivide=None),
                            (rneg, rpos): HandlerTuple(ndivide=None, pad=0.)})

## Zeige das Diagramm an
plt.show()

Benutzereigene Klassen schreiben, um Legenden zu stylisieren

In diesem Schritt werden wir benutzereigene Klassen schreiben, um Legenden zu stylisieren.

## Definiere Daten für das Diagramm
class HandlerDashedLines(HandlerLineCollection):
    """
    Benutzerspezifischer Handler für LineCollection-Instanzen.
    """
    def create_artists(self, legend, orig_handle,
                       xdescent, ydescent, width, height, fontsize, trans):
        ## ermittle, wie viele Linien es gibt
        numlines = len(orig_handle.get_segments())
        xdata, xdata_marker = self.get_xdata(legend, xdescent, ydescent,
                                             width, height, fontsize)
        leglines = []
        ## teile den vertikalen Raum, in dem die Linien platziert werden,
        ## in gleich große Teile basierend auf der Anzahl der Linien auf
        ydata = np.full_like(xdata, height / (numlines + 1))
        ## für jede Linie erzeuge die Linie an der richtigen Position
        ## und setze das Strichelduster
        for i in range(numlines):
            legline = Line2D(xdata, ydata * (numlines - i) - ydescent)
            self.update_prop(legline, orig_handle, legend)
            ## setze Farbe, Strichelduster und Linienstärke auf die
            ## der Linien in der LineCollection
            versuche:
                color = orig_handle.get_colors()[i]
            außer:
                color = orig_handle.get_colors()[0]
            versuche:
                dashes = orig_handle.get_dashes()[i]
            außer:
                dashes = orig_handle.get_dashes()[0]
            versuche:
                lw = orig_handle.get_linewidths()[i]
            außer:
                lw = orig_handle.get_linewidths()[0]
            wenn das zweite Element von dashes nicht None ist:
                legline.set_dashes(dashes[1])
            legline.set_color(color)
            legline.set_transform(trans)
            legline.set_linewidth(lw)
            leglines.append(legline)
        return leglines

## Erstelle ein Diagramm mit mehreren Linien
x = np.linspace(0, 5, 100)
fig, ax = plt.subplots()
colors = plt.rcParams['axes.prop_cycle'].by_key()['color'][:5]
styles = ['solid', 'dashed', 'dashed', 'dashed','solid']
for i, color, style in zip(range(5), colors, styles):
    ax.plot(x, np.sin(x) -.1 * i, c=color, ls=style)

## Erstelle Proxy-Künstler und eine Legende
line = [[(0, 0)]]
lc = mcol.LineCollection(5 * line, linestyles=styles, colors=colors)
ax.legend([lc], ['multi-line'], handler_map={type(lc): HandlerDashedLines()},
          handlelength=2.5, handleheight=3)

## Zeige das Diagramm an
plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man in Matplotlib Legenden erstellt und anpasst. Wir haben gezeigt, wie man Legenden für bestimmte Linien, komplexe Beschriftungen und komplexere Diagramme erstellt. Wir haben auch gezeigt, wie man benutzerdefinierte Klassen schreibt, um Legenden zu stylisieren. Legenden sind ein wichtiger Bestandteil jedes Diagramms, und das Verständnis, wie man sie erstellt und anpasst, ist unerlässlich für die Erstellung effektiver Visualisierungen.