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.