【发布时间】:2021-06-23 19:27:01
【问题描述】:
我正在尝试在 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 或 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 传递给热图以打印平方单元格,结果是这样的:
问题:如何将表格及其单元格附加到热图中并将其居中?
编辑: 从技术上讲,tdy's answer 可以解决我的简单示例的问题。虽然我可能过度简化了它并遗漏了一条重要信息。
在我的真实案例场景中,如果我使用以下方式创建图形:
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) 和 tight_layout 对我的问题有很大影响,但我既不知道为什么也不知道如何解决它。
【问题讨论】:
标签: python pandas matplotlib seaborn heatmap