[英]How to keep color bar width consistent in seaborn heatmap subplots
我試圖在一個具有不同子圖的圖形上繪制兩個具有相同x軸的熱圖,每個圖的比例不同,因此它們需要不同的色條。 每個熱圖在y軸上還具有不同數量的觀察值,請參見下文:
import numpy as np
import seaborn as sns
arr1 = np.random.rand(10, 10)*100
arr2 = np.random.rand(2, 10)
fig, axes = plt.subplots(2, 1,
gridspec_kw={'height_ratios':[5, 1]},
sharex=True)
sns.heatmap(arr1, ax=axes[0])
sns.heatmap(arr2, ax=axes[1])
彩圖的寬度在各圖之間不一致。 這是有道理的,並非意外,但是出於美學原因,我想強制使每個寬度保持一致。
我嘗試使用cbar
參數並顯式定義了colorbar的大小和位置:
fig, axes = plt.subplots(2, 1,
gridspec_kw={'height_ratios':[5, 1]},
sharex=True)
sns.heatmap(arr1, ax=axes[0])
cbar_ax = fig.add_axes([.85, .135, .019, .15])
sns.heatmap(arr2, ax=axes[1], cbar_ax=cbar_ax)
盡管這樣做,圖不再是一致的寬度。 是在單個軸子圖上為每個顏色條定義軸的最佳方法嗎? 似乎有一種更簡單的方式讓我錯過了
如果可能,請嘗試使用GridSpec來組織4 個子圖(兩個主圖和兩個色條在其各自的axes
):
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
arr1 = np.random.rand(10, 10)*100
arr2 = np.random.rand(2, 10)
fig, axes = plt.subplots(2, 2,
gridspec_kw={'height_ratios': [5, 1],
'width_ratios': [30, 1],
'wspace': 0.1},
sharex='col')
sns.heatmap(arr1, ax=axes[0][0], cbar_ax=axes[0][1])
sns.heatmap(arr2, ax=axes[1][0], cbar_ax=axes[1][1])
使用add_axes
,您手動添加了一個子圖( axes
)並將其強制到特定位置。 這可能會使新的子圖很難與其他子圖協調。 在您的第二個圖中,結果表明第三個axes
在周圍浮動並位於其他子圖的頂部。
第二種方法的問題是將顏色條移出arr2
的axes
。 因此,主圖占用其axes
的整個寬度,而arr1
的主圖與其色條共享其axes
的整個寬度。 認為這兩個主要圖似乎“不再是一致的寬度”,因此這兩個子圖( axes
的寬度仍然一致)。
您可以將cbar_ax
軸( cbar_ax
)定義為子圖網格的一部分,以使兩行之間的所有間距和寬度都同步。
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
arr1 = np.random.rand(10, 10)*100
arr2 = np.random.rand(2, 10)
fig, axes = plt.subplots(2, 2,
gridspec_kw={'height_ratios':[5, 1],
'width_ratios' :[1, 0.04]})
sns.heatmap(arr1, ax=axes[0,0], cbar_ax=axes[0,1])
sns.heatmap(arr2, ax=axes[1,0], cbar_ax=axes[1,1])
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.