Seaborn子图中的热力图 - 对齐X轴

4

我正在尝试绘制一个包含两个子图的图像,其中一个是 seaborn 热图 ,另一个是简单的 matplotlib 折线图。然而,当共享 x 轴时,它们不会对齐,如下图所示:

figure

似乎这个问题类似于这篇文章,但是当调用ax[0].get_xticks()ax[1].get_xticks()时,我得到了相同的位置,所以我不知道该怎么更改。此外,在我的图片中,偏差似乎超过了0.5个刻度。

我做错了什么?

我用来绘制图像的代码如下:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

M_1=np.random.random((15,15))
M_2=np.random.random((15,15))

L_1=np.random.random(15)
L_2=np.random.random(15)

x=range(15)

cmap = sns.color_palette("hot", 100)
sns.set(style="white")

fig, ax  = plt.subplots(2, 1, sharex='col', figsize=(10, 12))

ax[0].plot(x,L_1,'-', marker='o',color='tab:orange')
sns.heatmap(M_1, cmap=cmap, vmax=np.max(M_1), center=np.max(M_1)/2., square=False, ax=ax[1])

您可以在热力图代码中使用 cbar=False 来对齐它。 - r-beginners
我认为色条非常重要。那么,如何创建一个gridspec pattern,将下部子图细分为热力图区域和较小的色条区域,然后使用热力图的cbar_ax参数在这个指定的ax空间中绘制色条呢? - Mr. T
1个回答

6

@Mr-T的评论非常中肯。最简单的方法是提前创建坐标轴,而不是让heatmap()调整坐标轴大小以为色条留出空间。

还有一个问题是,热图的标签实际上并不位于[0,1,...],而是位于每个单元格的中心[0.5, 1.5, ...]。因此,如果您希望您的上方图与底部的标签对齐(并与每个单元格的中心对齐),则可能需要将图形向右移动0.5个单位:

M_1=np.random.random((15,15))
M_2=np.random.random((15,15))
L_1=np.random.random(15)
L_2=np.random.random(15)
x=np.arange(15)

cmap = sns.color_palette("hot", 100)
sns.set(style="white")

fig, ax  = plt.subplots(2, 2, sharex='col', gridspec_kw={'width_ratios':[100,5]})
ax[0,1].remove()  # remove unused upper right axes
ax[0,0].plot(x+0.5,L_1,'-', marker='o',color='tab:orange')
sns.heatmap(M_1, cmap=cmap, vmax=np.max(M_1), center=np.max(M_1)/2., square=False, ax=ax[1,0], cbar_ax=ax[1,1])

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接