子图中的 Seaborn 热图 - 对齐 x 轴

lfo*_*-po 4 python matplotlib heatmap subplot seaborn

我正在尝试绘制一个包含两个子图、一个seaborn 热图和简单的matplotlib 线的图形。然而,当共享两个图的 x 轴时,它们没有对齐,如下图所示:

数字

看起来问题与这篇文章类似,但是在显示时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])
Run Code Online (Sandbox Code Playgroud)

Diz*_*ahi 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])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述