放置色彩條#

色彩條指示影像資料的定量範圍。在圖表中放置色彩條並非易事,因為需要為它們預留空間。

自動放置色彩條#

最簡單的情況是將色彩條附加到每個軸。請注意,在此範例中,色彩條會從父軸中佔用一些空間。

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

第一列在兩行中具有相同類型的資料,因此可能需要只有一個色彩條。我們透過傳遞具有 _ax_ kwarg 的軸列表給 Figure.colorbar 來實現此目的。

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

被佔用的空間可能會導致同一子圖佈局中的軸大小不同,如果每個繪圖的 x 軸都應該像以下範例一樣具有可比性,則通常不希望這樣。

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

這通常是不希望發生的,並且可以透過各種方式解決,例如,向其他軸添加色彩條然後移除它。但是,最直接的方法是使用約束佈局

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

使用此範例可以實現相對複雜的色彩條佈局。請注意,此範例在使用 layout='constrained' 時效果更好

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

調整色彩條與父軸之間的間距#

可以使用 _pad_ 關鍵字參數調整色彩條與父軸之間的距離。這是以父軸寬度的分數為單位,垂直軸的預設值為 0.05(水平軸為 0.15)。

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'

請注意,如果您不使用約束佈局,則 pad 命令會使父軸縮小

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

手動放置色彩條#

有時,colorbar 提供的自動放置效果不理想。我們可以手動建立一個軸,並透過將軸傳遞給 _cax_ 關鍵字參數,告訴 colorbar 使用該軸。

使用 inset_axes#

我們可以手動建立任何類型的軸供色彩條使用,但是 Axes.inset_axes 很有用,因為它是父軸的子軸,並且可以相對於父軸定位。在這裡,我們新增一個色彩條,使其居中放置在父軸的底部附近。

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 也可以使用 _transform_ 關鍵字參數在資料座標中指定其位置

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

附加到固定縱橫比軸的色彩條#

對於具有固定縱橫比的軸,放置色彩條是一個特殊的挑戰,因為父軸的大小會根據資料檢視而變化。

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

我們使用 Axes.inset_axes 將軸定位在「軸座標」中來解決此問題(請參閱轉換教學)。請注意,如果您放大父軸,從而改變其形狀,則色彩條的位置也會改變。

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

腳本的總執行時間: (0 分鐘 10.655 秒)

由 Sphinx-Gallery 產生的圖庫