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.

fig, axs = plt.subplot_mosaic([['histx', '.'],
                               ['scatter', 'histy']],
                              figsize=(6, 6),
                              width_ratios=(4, 1), height_ratios=(1, 4),
                              layout='constrained')
scatter_hist(x, y, axs['scatter'], axs['histx'], axs['histy'])
scatter hist

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()
scatter hist

Obwohl wir die Verwendung einer der beiden oben beschriebenen Methoden empfehlen, gibt es eine Reihe anderer Möglichkeiten, ein ähnliches Layout zu erzielen

Tags: Komponente: Achsen Plot-Typ: Streudiagramm Plot-Typ: Histogramm Level: Fortgeschritten

Gesamtlaufzeit des Skripts: (0 Minuten 2,812 Sekunden)

Galerie generiert von Sphinx-Gallery