Anpassen von Matplotlib-Visualisierungen mit Markern

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

Matplotlib ist eine beliebte Python-Bibliothek, die zur Erstellung von Visualisierungen wie Diagrammen, Graphen und Plots verwendet wird. Einer der wichtigsten Bestandteile von Matplotlib sind Marker, die zur Darstellung von Datenpunkten in einem Plot verwendet werden. Marker kommen in verschiedenen Formen, Größen und Stilen und können angepasst werden, um einem bestimmten Datensatz zu entsprechen. In diesem Lab werden Sie lernen, wie Sie Matplotlib-Marker verwenden, um benutzerdefinierte Visualisierungen zu erstellen, die Ihre Daten effektiv vermitteln.

Tipps für die VM

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, und wir werden das Problem für Sie prompt beheben.

Leere Marker

Leere Marker haben eine einfarbige Darstellung. Der folgende Code zeigt, wie man leere Marker erstellt:

unfilled_markers = [m for m, func in Line2D.markers.items()
                    if func!= 'nothing' and m not in Line2D.filled_markers]

for ax, markers in zip(axs, split_list(unfilled_markers)):
    for y, marker in enumerate(markers):
        ax.text(-0.5, y, repr(marker), **text_style)
        ax.plot([y] * 3, marker=marker, **marker_style)
    format_axes(ax)

Gefüllte Marker

Gefüllte Marker sind das Gegenteil von leeren Markern. Der folgende Code zeigt, wie man gefüllte Marker erstellt:

fig, axs = plt.subplots(ncols=2)
fig.suptitle('Filled markers', fontsize=14)
for ax, markers in zip(axs, split_list(Line2D.filled_markers)):
    for y, marker in enumerate(markers):
        ax.text(-0.5, y, repr(marker), **text_style)
        ax.plot([y] * 3, marker=marker, **marker_style)
    format_axes(ax)

Marker-Füllstile

Die Randfarbe und die Füllfarbe von gefüllten Markern können separat angegeben werden. Darüber hinaus kann die fillstyle so konfiguriert werden, dass sie leer, vollständig gefüllt oder in verschiedenen Richtungen halb gefüllt ist. Die halb gefüllten Stile verwenden markerfacecoloralt als sekundäre Füllfarbe. Der folgende Code zeigt, wie man Marker-Füllstile erstellt:

fig, ax = plt.subplots()
fig.suptitle('Marker fillstyle', fontsize=14)
fig.subplots_adjust(left=0.4)

filled_marker_style = dict(marker='o', linestyle=':', markersize=15,
                           color='darkgrey',
                           markerfacecolor='tab:blue',
                           markerfacecoloralt='lightsteelblue',
                           markeredgecolor='brown')

for y, fill_style in enumerate(Line2D.fillStyles):
    ax.text(-0.5, y, repr(fill_style), **text_style)
    ax.plot([y] * 3, fillstyle=fill_style, **filled_marker_style)
format_axes(ax)

Marker aus TeX-Symbolen erstellt

Verwenden Sie :ref:MathText <mathtext>, um benutzerdefinierte Markersymbole wie z. B. "$\u266B$" zu verwenden. Für einen Überblick über die STIX-Schriftzeichen verweisen Sie auf die STIX-Schriftzeichentabelle <http://www.stixfonts.org/allGlyphs.html>_. Siehe auch das :doc:/gallery/text_labels_and_annotations/stix_fonts_demo.

fig, ax = plt.subplots()
fig.suptitle('Mathtext markers', fontsize=14)
fig.subplots_adjust(left=0.4)

marker_style.update(markeredgecolor="none", markersize=15)
markers = ["$1$", r"$\frac{1}{2}$", "$f$", "$\u266B$", r"$\mathcal{A}$"]

for y, marker in enumerate(markers):
    ## Escape dollars so that the text is written "as is", not as mathtext.
    ax.text(-0.5, y, repr(marker).replace("$", r"\$"), **text_style)
    ax.plot([y] * 3, marker=marker, **marker_style)
format_axes(ax)

Marker aus Pfaden erstellt

Jeder ~.path.Path kann als Marker verwendet werden. Das folgende Beispiel zeigt zwei einfache Pfade stern und kreis sowie einen aufwendigeren Pfad eines Kreises mit einem ausgeschnittenen Stern.

import numpy as np

import matplotlib.path as mpath

star = mpath.Path.unit_regular_star(6)
circle = mpath.Path.unit_circle()
## concatenate the circle with an internal cutout of the star
cut_star = mpath.Path(
    vertices=np.concatenate([circle.vertices, star.vertices[::-1,...]]),
    codes=np.concatenate([circle.codes, star.codes]))

fig, ax = plt.subplots()
fig.suptitle('Path markers', fontsize=14)
fig.subplots_adjust(left=0.4)

markers = {'star': star, 'circle': circle, 'cut_star': cut_star}

for y, (name, marker) in enumerate(markers.items()):
    ax.text(-0.5, y, name, **text_style)
    ax.plot([y] * 3, marker=marker, **marker_style)
format_axes(ax)

Fortgeschrittene Marker-Modifikationen mit Transformieren

Markierungen können durch Übergeben einer Transformation an den MarkerStyle-Konstruktor modifiziert werden. Im folgenden Beispiel wird gezeigt, wie eine vorgegebene Rotation auf mehrere Markerformen angewendet wird.

common_style = {k: v for k, v in filled_marker_style.items() if k!= 'marker'}
angles = [0, 10, 20, 30, 45, 60, 90]

fig, ax = plt.subplots()
fig.suptitle('Rotated markers', fontsize=14)

ax.text(-0.5, 0, 'Filled marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    ax.plot(x, 0, marker=MarkerStyle('o', 'left', t), **common_style)

ax.text(-0.5, 1, 'Un-filled marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    ax.plot(x, 1, marker=MarkerStyle('1', 'left', t), **common_style)

ax.text(-0.5, 2, 'Equation marker', **text_style)
for x, theta in enumerate(angles):
    t = Affine2D().rotate_deg(theta)
    eq = r'$\frac{1}{x}$'
    ax.plot(x, 2, marker=MarkerStyle(eq, 'left', t), **common_style)

for x, theta in enumerate(angles):
    ax.text(x, 2.5, f"{theta}°", horizontalalignment="center")
format_axes(ax)

fig.tight_layout()

Einstellung des Marker-Cap-Stils und des Join-Stils

Marker haben standardmäßige Cap- und Join-Stile, aber diese können beim Erstellen eines MarkerStyles angepasst werden.

from matplotlib.markers import CapStyle, JoinStyle

marker_inner = dict(markersize=35,
                    markerfacecolor='tab:blue',
                    markerfacecoloralt='lightsteelblue',
                    markeredgecolor='brown',
                    markeredgewidth=8,
                    )

marker_outer = dict(markersize=35,
                    markerfacecolor='tab:blue',
                    markerfacecoloralt='lightsteelblue',
                    markeredgecolor='white',
                    markeredgewidth=1,
                    )

fig, ax = plt.subplots()
fig.suptitle('Marker CapStyle', fontsize=14)
fig.subplots_adjust(left=0.1)

for y, cap_style in enumerate(CapStyle):
    ax.text(-0.5, y, cap_style.name, **text_style)
    for x, theta in enumerate(angles):
        t = Affine2D().rotate_deg(theta)
        m = MarkerStyle('1', transform=t, capstyle=cap_style)
        ax.plot(x, y, marker=m, **marker_inner)
        ax.plot(x, y, marker=m, **marker_outer)
        ax.text(x, len(CapStyle) -.5, f'{theta}°', ha='center')
format_axes(ax)

Ändern des Join-Stils

Der Join-Stil von Markern kann ebenfalls auf ähnliche Weise geändert werden.

fig, ax = plt.subplots()
fig.suptitle('Marker JoinStyle', fontsize=14)
fig.subplots_adjust(left=0.05)

for y, join_style in enumerate(JoinStyle):
    ax.text(-0.5, y, join_style.name, **text_style)
    for x, theta in enumerate(angles):
        t = Affine2D().rotate_deg(theta)
        m = MarkerStyle('*', transform=t, joinstyle=join_style)
        ax.plot(x, y, marker=m, **marker_inner)
        ax.text(x, len(JoinStyle) -.5, f'{theta}°', ha='center')
format_axes(ax)

plt.show()

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie Matplotlib-Marker verwenden, um benutzerdefinierte Visualisierungen zu erstellen. Insbesondere haben Sie gelernt, wie Sie leere und gefüllte Marker, Marker-Füllstile, Marker aus TeX-Symbolen, Marker aus Pfaden, fortgeschrittene Marker-Modifikationen mit Transformieren und wie Sie den Marker-Cap-Stil und den Join-Stil einstellen. Mit diesen Techniken können Sie effektive Visualisierungen erstellen, die Ihre Daten klar und präzise vermitteln.