Hinweis
Gehen Sie zum Ende, um den vollständigen Beispielcode herunterzuladen.
Streudiagramm mit Histogrammen#
Fügen Sie Histogramme zu den Rändern der x-Achse und y-Achse eines Streudiagramms hinzu.
Dieses Layout besteht aus einem zentralen Streudiagramm, das die Beziehung zwischen x und y veranschaulicht, einem Histogramm oben, das die Verteilung von x zeigt, und einem Histogramm rechts, das die Verteilung von y zeigt.
Für eine gute Ausrichtung der Hauptachsen mit den Randelementen werden unten zwei Optionen gezeigt
Während Axes.inset_axes etwas komplexer sein mag, ermöglicht es die korrekte Handhabung von Hauptachsen mit einem festen Seitenverhältnis.
Lassen Sie uns zuerst eine Funktion definieren, die x- und y-Daten als Eingabe nimmt, sowie drei Achsen: die Hauptachse für das Streudiagramm und zwei Randachsen. Diese Funktion erstellt dann das Streudiagramm und die Histogramme innerhalb der bereitgestellten Achsen.
import matplotlib.pyplot as plt
import numpy as np
# Fixing random state for reproducibility
np.random.seed(19680801)
# some random data
x = np.random.randn(1000)
y = np.random.randn(1000)
def scatter_hist(x, y, ax, ax_histx, ax_histy):
# no labels
ax_histx.tick_params(axis="x", labelbottom=False)
ax_histy.tick_params(axis="y", labelleft=False)
# the scatter plot:
ax.scatter(x, y)
# now determine nice limits by hand:
binwidth = 0.25
xymax = max(np.max(np.abs(x)), np.max(np.abs(y)))
lim = (int(xymax/binwidth) + 1) * binwidth
bins = np.arange(-lim, lim + binwidth, binwidth)
ax_histx.hist(x, bins=bins)
ax_histy.hist(y, bins=bins, orientation='horizontal')
Definieren der Achsenpositionen mit subplot_mosaic#
Wir verwenden die Funktion subplot_mosaic, um die Positionen und Namen der drei Achsen zu definieren; die leere Achse wird durch '.' angegeben. Wir geben die Größe der Abbildung manuell an und können die verschiedenen Achsen unterschiedlich groß machen, indem wir die Argumente width_ratios und height_ratios angeben. Das Argument layout wird auf 'constrained' gesetzt, um den Abstand zwischen den Achsen zu optimieren.

Definieren der Achsenpositionen mit inset_axes#
inset_axes kann verwendet werden, um Randelemente *außerhalb* der Hauptachsen zu positionieren. Der Vorteil davon ist, dass das Seitenverhältnis der Hauptachsen fixiert werden kann und die Randelemente immer relativ zur Position der Achsen gezeichnet werden.
# Create a Figure, which doesn't have to be square.
fig = plt.figure(layout='constrained')
# Create the main Axes.
ax = fig.add_subplot()
# The main Axes' aspect can be fixed.
ax.set_aspect('equal')
# Create marginal Axes, which have 25% of the size of the main Axes. Note that
# the inset Axes are positioned *outside* (on the right and the top) of the
# main Axes, by specifying axes coordinates greater than 1. Axes coordinates
# less than 0 would likewise specify positions on the left and the bottom of
# the main Axes.
ax_histx = ax.inset_axes([0, 1.05, 1, 0.25], sharex=ax)
ax_histy = ax.inset_axes([1.05, 0, 0.25, 1], sharey=ax)
# Draw the scatter plot and marginals.
scatter_hist(x, y, ax, ax_histx, ax_histy)
plt.show()

Obwohl wir die Verwendung einer der beiden oben beschriebenen Methoden empfehlen, gibt es eine Reihe anderer Möglichkeiten, ein ähnliches Layout zu erzielen
Die Achsen können manuell in relativen Koordinaten mit
add_axespositioniert werden.Ein Gridspec kann verwendet werden, um das Layout zu erstellen (
add_gridspec) und nur die drei gewünschten Achsen hinzuzufügen (add_subplot).Vier Subplots können mit
subplotserstellt werden, und die ungenutzte Achse oben rechts kann manuell entfernt werden.Das Toolkit
axes_grid1kann verwendet werden, wie in Histogramm an Streudiagramm mit locatable Axes ausrichten gezeigt.
Referenzen
Die Verwendung der folgenden Funktionen, Methoden, Klassen und Module wird in diesem Beispiel gezeigt
Gesamtlaufzeit des Skripts: (0 Minuten 2,812 Sekunden)