Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在seaborn热图子地块中保持颜色栏宽度一致_Python_Numpy_Matplotlib_Heatmap_Seaborn - Fatal编程技术网

Python 如何在seaborn热图子地块中保持颜色栏宽度一致

Python 如何在seaborn热图子地块中保持颜色栏宽度一致,python,numpy,matplotlib,heatmap,seaborn,Python,Numpy,Matplotlib,Heatmap,Seaborn,我试图在一个图形上绘制两个具有相同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_k

我试图在一个图形上绘制两个具有相同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
参数并明确定义颜色条的大小和位置:

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个子图(两个主图和两个色条位于各自的
轴中)

然后,对您的想法进行一些评论: 使用
add_axes
时,可以手动添加子批次(
axes
),并强制将其放置在特定位置。这可能会使新的子地块难以与其他子地块协调。在第二个图中,第三个
轴浮动并位于其他子图的顶部

第二种方法的问题是将颜色条移出
arr2
轴。因此,主绘图采用其
的全宽,而
arr1
的主绘图采用其彩色条共享其
的全宽。虽然两个主图似乎“宽度不再一致”,但两个子图(
的宽度仍然一致)。

首先解决方案 如果可能,请尝试使用GridSpec组织您的4个子图(两个主图和两个色条位于各自的
轴中)

然后,对您的想法进行一些评论: 使用
add_axes
时,可以手动添加子批次(
axes
),并强制将其放置在特定位置。这可能会使新的子地块难以与其他子地块协调。在第二个图中,第三个
轴浮动并位于其他子图的顶部


第二种方法的问题是将颜色条移出
arr2
轴。因此,主绘图采用其
的全宽,而
arr1
的主绘图采用其彩色条共享其
的全宽。虽然两个主图似乎“宽度不再一致”,但两个子图(
轴的宽度仍然一致)。

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

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