簡體   English   中英

如何在Seaborn熱圖子圖中保持顏色條寬度一致

[英]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在周圍浮動並位於其他子圖的頂部。

第二種方法的問題是將顏色條移出arr2axes 因此,主圖占用其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.

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