Matplotlib Box Aspekt

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

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.