我正在尝试在seaborn 热图下添加一个matplotlib 表。
我已经能够绘制它们,但没有对齐的运气。
# Main data
df = pd.DataFrame({"A": [20, 10, 7, 39],
"B": [1, 8, 12, 9],
"C": [780, 800, 1200, 250]})
# It contains min and max values for the df cols
df_info = pd.DataFrame({"A": [22, 35],
"B": [5, 10],
"C": [850, 900]})
df_norm = (df - df.min())/(df.max() - df.min())
# Plot the heatmap
vmin = df_norm.min().min()
vmax = df_norm.max().max()
fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)
sns.heatmap(df_norm, ax=ax1, annot=df, cmap='RdBu_r', cbar=True)
当我将表添加到ax2
它是根据热图的所有宽度绘制的(包括颜色条)。我已经尝试了所有可能的组合loc
or bbox
但我无法将表格精确居中并赋予其与顶部热图相同的宽度(整个表格以及单个单元格的宽度)。
table = df_info
cell_text = []
for row in range(len(table)):
cell_text.append(table.iloc[row])
ax2.axis('off')
ax2.table(cellText=cell_text,
rowLabels=table.index,
colLabels=None,
loc='center')
有时我也会将参数传递给热图square=True
打印平方单元格,结果是这样的:
问题:如何将表格及其单元格附加到热图并将其居中?
EDIT:从技术上来说tdy的回答 https://stackoverflow.com/a/66827453/1191416解决我的简单示例的问题是正确的。尽管我可能过于简化了它并遗漏了一条重要的信息。
在我的真实案例中,如果我使用以下命令创建图形:
fig, (ax1, ax2) = plt.subplots(nrows=2,
**{"figsize": (18, 18),
"dpi": 200,
"tight_layout": True})
并应用上面提到的答案我得到这样的东西:
表格距离底部很远并且比热图更宽。
另外如果我设置tight_layout=False
我获得了一个宽度正确但仍位于底部很远的表格:
fig, (ax1, ax2) = plt.subplots(nrows=2,
**{"figsize": (18, 18),
"dpi": 200,
"tight_layout": False})
我想就我而言"figsize": (18, 18)
and tight_layout
对我的问题有很大影响,但我不确定为什么也不知道如何解决它。