Posizionamento delle barre dei colori #

Le barre colorate indicano l'estensione quantitativa dei dati dell'immagine. Il posizionamento in una figura non è banale perché è necessario fare spazio per loro.

Il caso più semplice è semplicemente collegare una barra dei colori a ciascun asse:

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)
posizionamento della barra dei colori

La prima colonna ha lo stesso tipo di dati in entrambe le righe, quindi potrebbe essere desiderabile combinare la barra dei colori che facciamo chiamando Figure.colorbarcon un elenco di assi invece di un singolo asse.

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)
posizionamento della barra dei colori

Utilizzando questo paradigma sono possibili layout di barre dei colori relativamente complicati. Si noti che questo esempio funziona molto meglio con constrained_layout=True

fig, axs = plt.subplots(3, 3, constrained_layout=True)
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')
posizionamento della barra dei colori
<matplotlib.colorbar.Colorbar object at 0x7f2cfb43f070>

Barre colore con assi a proporzioni fisse #

Il posizionamento delle barre dei colori per gli assi con proporzioni fisse rappresenta una sfida particolare in quanto le dimensioni degli assi principali cambiano a seconda della visualizzazione dei dati.

fig, axs = plt.subplots(2, 2,  constrained_layout=True)
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)
posizionamento della barra dei colori

Un modo per aggirare questo problema è utilizzare an Axes.inset_axesper individuare gli assi nelle coordinate degli assi. Si noti che se si esegue lo zoom avanti sugli assi e si modifica la forma degli assi, anche la barra dei colori cambierà posizione.

fig, axs = plt.subplots(2, 2, constrained_layout=True)
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, ax=ax, cax=cax)

plt.show()
posizionamento della barra dei colori

Tempo di esecuzione totale dello script: (0 minuti 4,244 secondi)

Galleria generata da Sphinx-Gallery