2017-08-11 29 views
0

我想绘制两个热图,它们在具有不同子图的单个图上具有相同的x轴,每个图的比例都不同,因此它们需要不同的颜色条。每个热图也具有不同数量的沿y轴的观察,见下文:如何在seaborn热图子图中保持色条宽度一致

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]) 

enter image description here

彩条的宽度是不重复之间是一致的。这是有道理的,并不是出乎意料的,但是我想强制每一个的宽度在审美方面是一致的。

我尝试使用cbar参数,并明确界定了彩条的大小和位置:在做这个

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) 

enter image description here

尽管该地块已不再一致的宽度。在这里最好的方法是为各个轴子图上的每个颜色条定义轴吗?似乎有可能是我失踪

回答

3

解决方案第一

如果可能的话更简单的方法,可以尝试使用GridSpec来组织你的4副区(两个主要情节和两个colorbars在自己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]) 

enter image description here

然后,在你的想法有些意见:

当您使用add_axes时,您手动添加一个子图(axes)并将其强制在特定位置。这可能会使新的子图很难与其他子图协作。在你的第二个情节中,第3个axes漂浮在其他小插图的顶部。

第二种方法的问题是您将颜色条移出axesarr2。因此,主要地块的全部宽度为axes,而主要地块arr1与其颜色条共享其axes的全部宽度。认为两个主要地块似乎“不再一致的宽度”,两个子地块(axes宽度仍然一致)。

1

您可以将色条轴(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() 

enter image description here