Farbtafeln platzieren#

Farbtafeln zeigen den quantitativen Umfang von Bilddaten an. Die Platzierung in einer Abbildung ist nicht trivial, da Raum für sie geschaffen werden muss.

Automatische Platzierung von Farbtafeln#

Der einfachste Fall ist, jede Achse mit einer Farbtafel zu verbinden. Beachten Sie in diesem Beispiel, dass die Farbtafeln etwas Platz von der übergeordneten Achse beanspruchen.

import matplotlib.pyplot as plt
import numpy as np

# Fixing random state for reproducibility
np.random.seed(19680801)

fig, axs = plt.subplots(2, 2)
cmaps = ['RdBu_r', 'viridis']
for col in range(2):
    for row in range(2):
        ax = axs[row, col]
        pcm = ax.pcolormesh(np.random.random((20, 20)) * (col + 1),
                            cmap=cmaps[col])
        fig.colorbar(pcm, ax=ax)
colorbar placement

Die erste Spalte enthält in beiden Zeilen die gleiche Art von Daten, daher kann es wünschenswert sein, nur eine Farbtafel zu haben. Wir tun dies, indem wir Figure.colorbar eine Liste von Achsen mit dem Argument ax übergeben.

fig, axs = plt.subplots(2, 2)
cmaps = ['RdBu_r', 'viridis']
for col in range(2):
    for row in range(2):
        ax = axs[row, col]
        pcm = ax.pcolormesh(np.random.random((20, 20)) * (col + 1),
                            cmap=cmaps[col])
    fig.colorbar(pcm, ax=axs[:, col], shrink=0.6)
colorbar placement

Der beanspruchte Platz kann dazu führen, dass Achsen im gleichen Subplot-Layout unterschiedliche Größen haben, was oft unerwünscht ist, wenn die x-Achse in jedem Plot vergleichbar sein soll, wie im Folgenden

fig, axs = plt.subplots(2, 1, figsize=(4, 5), sharex=True)
X = np.random.randn(20, 20)
axs[0].plot(np.sum(X, axis=0))
pcm = axs[1].pcolormesh(X)
fig.colorbar(pcm, ax=axs[1], shrink=0.6)
colorbar placement

Dies ist im Allgemeinen unerwünscht und kann auf verschiedene Weise umgangen werden, z. B. indem eine Farbtafel zu den anderen Achsen hinzugefügt und dann entfernt wird. Am einfachsten ist es jedoch, Constrained Layout zu verwenden.

fig, axs = plt.subplots(2, 1, figsize=(4, 5), sharex=True, layout='constrained')
axs[0].plot(np.sum(X, axis=0))
pcm = axs[1].pcolormesh(X)
fig.colorbar(pcm, ax=axs[1], shrink=0.6)
colorbar placement

Mit diesem Paradigma sind relativ komplizierte Farbtafel-Layouts möglich. Beachten Sie, dass dieses Beispiel mit layout='constrained' weitaus besser funktioniert.

fig, axs = plt.subplots(3, 3, layout='constrained')
for ax in axs.flat:
    pcm = ax.pcolormesh(np.random.random((20, 20)))

fig.colorbar(pcm, ax=axs[0, :2], shrink=0.6, location='bottom')
fig.colorbar(pcm, ax=[axs[0, 2]], location='bottom')
fig.colorbar(pcm, ax=axs[1:, :], location='right', shrink=0.6)
fig.colorbar(pcm, ax=[axs[2, 1]], location='left')
colorbar placement

Anpassen des Abstands zwischen Farbtafeln und übergeordneten Achsen#

Der Abstand einer Farbtafel von der übergeordneten Achse kann mit dem Schlüsselwortargument pad angepasst werden. Dies sind Einheiten als Bruchteil der Breite der übergeordneten Achse, und der Standardwert für eine vertikale Achse ist 0,05 (oder 0,15 für eine horizontale Achse).

fig, axs = plt.subplots(3, 1, layout='constrained', figsize=(5, 5))
for ax, pad in zip(axs, [0.025, 0.05, 0.1]):
    pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
    fig.colorbar(pcm, ax=ax, pad=pad, label=f'pad: {pad}')
fig.suptitle("layout='constrained'")
layout='constrained'

Beachten Sie, dass, wenn Sie kein Constrained Layout verwenden, der pad-Befehl die übergeordnete Achse schrumpfen lässt.

fig, axs = plt.subplots(3, 1, figsize=(5, 5))
for ax, pad in zip(axs, [0.025, 0.05, 0.1]):
    pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
    fig.colorbar(pcm, ax=ax, pad=pad, label=f'pad: {pad}')
fig.suptitle("No layout manager")
No layout manager

Manuelle Platzierung von Farbtafeln#

Manchmal liefert die automatische Platzierung durch colorbar nicht den gewünschten Effekt. Wir können manuell eine Achse erstellen und colorbar anweisen, diese Achse zu verwenden, indem wir die Achse dem Schlüsselwortargument cax übergeben.

Verwendung von inset_axes#

Wir können jede Art von Achse manuell erstellen, die die Farbtafel verwenden soll. Eine Axes.inset_axes ist nützlich, da sie ein Kind der übergeordneten Achse ist und relativ zur übergeordneten Achse positioniert werden kann. Hier fügen wir eine Farbtafel hinzu, die nahe am unteren Rand der übergeordneten Achse zentriert ist.

fig, ax = plt.subplots(layout='constrained', figsize=(4, 4))
pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
ax.set_ylim([-4, 20])
cax = ax.inset_axes([0.3, 0.07, 0.4, 0.04])
fig.colorbar(pcm, cax=cax, orientation='horizontal')
colorbar placement

Axes.inset_axes kann seine Position auch in Datenkoordinaten unter Angabe des transform-Schlüsselwortarguments festlegen, wenn Sie möchten, dass Ihre Achsen an einer bestimmten Datenposition im Diagramm liegen.

fig, ax = plt.subplots(layout='constrained', figsize=(4, 4))
pcm = ax.pcolormesh(np.random.randn(20, 20), cmap='viridis')
ax.set_ylim([-4, 20])
cax = ax.inset_axes([7.5, -1.7, 5, 1.2], transform=ax.transData)
fig.colorbar(pcm, cax=cax, orientation='horizontal')
colorbar placement

Farbtafeln, die an Achsen mit festem Seitenverhältnis angehängt sind#

Das Platzieren von Farbtafeln für Achsen mit einem festen Seitenverhältnis stellt eine besondere Herausforderung dar, da sich die übergeordnete Achse je nach Datenansicht in der Größe ändert.

fig, axs = plt.subplots(2, 2,  layout='constrained')
cmaps = ['RdBu_r', 'viridis']
for col in range(2):
    for row in range(2):
        ax = axs[row, col]
        pcm = ax.pcolormesh(np.random.random((20, 20)) * (col + 1),
                            cmap=cmaps[col])
        if col == 0:
            ax.set_aspect(2)
        else:
            ax.set_aspect(1/2)
        if row == 1:
            fig.colorbar(pcm, ax=ax, shrink=0.6)
colorbar placement

Wir lösen dieses Problem, indem wir Axes.inset_axes verwenden, um die Achsen in "Achsenkoordinaten" zu lokalisieren (siehe Transformations-Tutorial). Beachten Sie, dass, wenn Sie in die übergeordnete Achse hineinzoomen und dadurch ihre Form ändern, sich auch die Position der Farbtafel ändert.

fig, axs = plt.subplots(2, 2, layout='constrained')
cmaps = ['RdBu_r', 'viridis']
for col in range(2):
    for row in range(2):
        ax = axs[row, col]
        pcm = ax.pcolormesh(np.random.random((20, 20)) * (col + 1),
                            cmap=cmaps[col])
        if col == 0:
            ax.set_aspect(2)
        else:
            ax.set_aspect(1/2)
        if row == 1:
            cax = ax.inset_axes([1.04, 0.2, 0.05, 0.6])
            fig.colorbar(pcm, cax=cax)
colorbar placement

Siehe auch

Das axes_grid1 Toolkit bietet ebenfalls Methoden zum manuellen Erstellen von Farbtafel-Achsen.

Gesamtlaufzeit des Skripts: (0 Minuten 10,177 Sekunden)

Galerie generiert von Sphinx-Gallery