簡體   English   中英

Matplotlib顏色條具有一致的大小,可用於多個子圖

[英]Matplotlib colorbar with consistent size for multiple subplots

我正在嘗試創建一個具有多個帶有相同顏色條的子圖的圖形。 子圖必須具有相等的縱橫比,並且顏色欄必須具有與子圖相同的高度。 但是,我無法獲得與其他子圖相同高度的窄色條。

我正在使用配方來生成一個顏色條,其顏色范圍適用於所有子圖。 因此,MWE中未解決此問題。

使用軸分割器配方附加色條時,子圖的高度會因長寬比而變化。

這是MWE

from matplotlib import pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

import itertools as it
import numpy as np

mean = [0, 0]
cov = [[1, 0.5],
       [0.5, 4]]
n_samples = 10000
hrange = [[-5,5],[-5,5]]
bins = 20

# RANDOM DATA
Z_random = np.random.multivariate_normal(mean, cov, size=n_samples)
Z, xedges, yedges = np.histogram2d(Z_random[:,0], Z_random[:,1], bins=bins, range=hrange, normed=True)
X, Y = np.meshgrid(xedges, yedges)

# PLOT PCOLORMESHS
fig, axes = plt.subplots(2,3, subplot_kw=dict(aspect="equal"))
axes = dict(enumerate(fig.get_axes(),1))

for i,ax in axes.items():
    if i==6:
        break
    pcm = ax.pcolormesh(X,Y,Z)

# PLOT COLORBAR
divider = make_axes_locatable(axes[6])
cax = divider.append_axes("left", size="15%", pad=0.0)
fig.colorbar(pcm, cax=cax, label=r"Colorbar label")

MWE

我可以在整個子圖上繪制顏色條,在這種情況下,高度是正確的,但是吸引人的范圍很大。

是否有人有“健壯”的解決方案,即無需手動擺弄持有顏色條的子圖的尺寸?

提前致謝!

編輯:增加顏色條的寬度以強調它的高度變小。

如果唯一的目的是使顏色欄的高度與其水平鄰居的高度正確對齊,則此答案的最后解決方案將有所幫助。

但是,如果您還希望顏色條與頂部的圖左對齊,則解決方案可能更復雜。

您可以使用回調明確地設置顏色條的位置,如下所示:

from matplotlib import pyplot as plt
from matplotlib.transforms import Bbox
import numpy as np

mean = [0, 0]
cov = [[1, 0.5],
       [0.5, 4]]
n_samples = 10000
hrange = [[-5,5],[-5,5]]
bins = 20

# RANDOM DATA
Z_random = np.random.multivariate_normal(mean, cov, size=n_samples)
Z, xedges, yedges = np.histogram2d(Z_random[:,0], Z_random[:,1], bins=bins, range=hrange, normed=True)
X, Y = np.meshgrid(xedges, yedges)

# PLOT PCOLORMESHS
fig, axes = plt.subplots(2,3, subplot_kw=dict(aspect="equal"))

for i,ax in enumerate(axes.flat):
    if i==5:
        break
    pcm = ax.pcolormesh(X,Y,Z)

# PLOT COLORBAR
cax = fig.add_axes([0.6,0.01,0.1,0.4])
fig.colorbar(pcm, cax=cax, label=r"Colorbar label")

def align_cbar(cax, hax, vax):
    hpos = hax.get_position()
    vpos = vax.get_position()
    bb = Bbox.from_extents(vpos.x0, hpos.y0, vpos.x0+vpos.width*.05,hpos.y1)
    if cax.get_position() != bb:
        cax.set_position(bb)
        fig.canvas.draw_idle()

align_cbar(cax, axes[1,1], axes[0,2])    
fig.canvas.mpl_connect("draw_event", lambda x: align_cbar(cax, axes[1,1], axes[0,2]))

plt.show()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM