【发布时间】:2021-04-24 21:05:00
【问题描述】:
我正在尝试将 Seaborn 基于时间的热图放置在条形图的顶部,以指示每个 bin/时间范围内的患者数量。我可以成功地制作单独的热图和条形图,但是将两者结合起来并不能达到预期效果。
import pandas as pd
import numpy as np
import seaborn as sb
from matplotlib import pyplot as plt
# Mock data
patient_counts = [650, 28, 8]
missings_df = pd.DataFrame(np.array([[-15.8, 600/650, 580/650, 590/650],
[488.2, 20/23, 21/23, 21/23],
[992.2, 7/8, 8/8, 8/8]]),
columns=['time', 'Resp. (/min)', 'SpO2', 'Blood Pressure'])
missings_df.set_index('time', inplace=True)
# Plot heatmap
fig, (ax1, ax2) = plt.subplots(nrows=2, figsize=(26, 16), sharex=True, gridspec_kw={'height_ratios': [5, 1]})
sb.heatmap(missings_df.T, cmap="Blues", cbar_kws={"shrink": .8}, ax=ax1, xticklabels=False)
plt.xlabel('Time (hours)')
# Plot line graph under heatmap to show nr. of patients in each bin
x_ticks = [time for time in missings_df.index]
ax2.bar([i for i, _ in enumerate(x_ticks)], patient_counts, align='center')
plt.xticks([i for i, _ in enumerate(x_ticks)], x_ticks)
plt.show()
这段代码给了我下面的图表。如您所见,有两个问题:
- 条形图延伸得太远
- 第一个和第二个条形图未与顶部图形对齐,其中第一个图的刻度也不与条形图的中心对齐。
我尝试在网上查找,但找不到解决问题的好资源。有什么想法吗?
【问题讨论】:
-
我想如果您创建一个 (2x2) 网格(或增加分辨率并将更大的部分分配给“左列”)并将颜色条绘制到单独的轴上以便于对齐热图和条形图。 (使用MVE 我本可以向您展示解决方案...)
-
@max 感谢您的评论,我已经修改了我的帖子。假设您已经安装了所有模块,现在应该可以复制和粘贴代码了。
标签: python matplotlib seaborn subplot