Einführung
In diesem Lab führen wir Sie durch den Prozess der Erstellung verschiedener Diagramme mit der set_box_aspect()-Methode in Matplotlib. Diese Methode setzt das Seitenverhältnis zwischen Achsenhöhe und -breite in physikalischen Einheiten unabhängig von den Datengrenzen. Sie eignet sich zur Erstellung von quadratischen Diagrammen, unabhängig von den darin enthaltenen Daten, oder zur Erstellung eines üblichen Diagramms mit den gleichen Achsendimensionen neben einem Bilddiagramm mit fester (Daten-)Seitenverhältnis.
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.
Ein quadratisches Achsenbild unabhängig von den Daten
Wir werden ein quadratisches Achsenbild erzeugen, unabhängig davon, was die Datengrenzen sind.
import matplotlib.pyplot as plt
import numpy as np
fig1, ax = plt.subplots()
ax.set_xlim(300, 400)
ax.set_box_aspect(1)
plt.show()
Geteilte quadratische Achsen
Wir werden geteilte Teilplots erzeugen, die in der Größe quadratisch sind.
fig2, (ax, ax2) = plt.subplots(ncols=2, sharey=True)
ax.plot([1, 5], [0, 10])
ax2.plot([100, 500], [10, 15])
ax.set_box_aspect(1)
ax2.set_box_aspect(1)
plt.show()
Quadratische geteilte Achsen
Wir werden ein quadratisches Achsenbild mit einer geteilten Achse erzeugen. Die geteilte Achse übernimmt das Seitenverhältnis der übergeordneten Achse.
fig3, ax = plt.subplots()
ax2 = ax.twinx()
ax.plot([0, 10])
ax2.plot([12, 10])
ax.set_box_aspect(1)
plt.show()
Normales Diagramm neben einem Bild
Wenn man ein Bilddiagramm mit einem festen Daten-Seitenverhältnis und der Standard-Einstellung adjustable="box" neben einem normalen Diagramm erstellt, sind die Achsenhöhen ungleich. set_box_aspect() bietet eine einfache Lösung dafür, indem es ermöglicht, dass die Achsen des normalen Diagramms die Abmessungen des Bildes als Seitenverhältnis verwenden. Dieses Beispiel zeigt auch, dass das constrained layout gut mit einem festen Seitenverhältnis zusammenarbeitet.
fig4, (ax, ax2) = plt.subplots(ncols=2, layout="constrained")
np.random.seed(19680801) ## Fixing random state for reproducibility
im = np.random.rand(16, 27)
ax.imshow(im)
ax2.plot([23, 45])
ax2.set_box_aspect(im.shape[0]/im.shape[1])
plt.show()
Quadratisches Verknüpfungs-/Randdiagramm
Es kann wünschenswert sein, neben einem Diagramm von Verknüpfungsdaten die Randverteilungen anzuzeigen. Folgender Code erstellt ein quadratisches Diagramm, bei dem das Seitenverhältnis der Randachsen gleich dem Verhältnis der Breite und Höhe des gridspec ist. Dies gewährleistet, dass alle Achsen perfekt ausgerichtet sind, unabhängig von der Größe der Figur.
fig5, axs = plt.subplots(2, 2, sharex="col", sharey="row",
gridspec_kw=dict(height_ratios=[1, 3],
width_ratios=[3, 1]))
axs[0, 1].set_visible(False)
axs[0, 0].set_box_aspect(1/3)
axs[1, 0].set_box_aspect(1)
axs[1, 1].set_box_aspect(3/1)
np.random.seed(19680801) ## Fixing random state for reproducibility
x, y = np.random.randn(2, 400) * [[.5], [180]]
axs[1, 0].scatter(x, y)
axs[0, 0].hist(x)
axs[1, 1].hist(y, orientation="horizontal")
plt.show()
Seitenverhältnis für viele Teilplots
Es ist möglich, das Seitenverhältnis an eine Achse beim Initialisieren zu übergeben. Folgender Code erstellt ein 2x3 Teilplot-Gitter mit allen quadratischen Achsen.
fig7, axs = plt.subplots(2, 3, subplot_kw=dict(box_aspect=1),
sharex=True, sharey=True, layout="constrained")
for i, ax in enumerate(axs.flat):
ax.scatter(i % 3, -((i // 3) - 0.5)*200, c=[plt.cm.hsv(i / 6)], s=300)
plt.show()
Zusammenfassung
In diesem Lab wurde ein Überblick über die Verwendung von set_box_aspect() in Matplotlib gegeben, um verschiedene Arten von Diagrammen mit einem festen Seitenverhältnis zwischen Achsenhöhe und -breite zu erstellen.