将子图与pyplot barplot和seaborn热图对齐

蒂姆·斯塔克

我试图在条形图上放置一个基于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()

这段代码为我提供了下图。如您所见,存在两个问题:

  1. 条形图延伸得太远
  2. 第一个和第二个条形图与顶部图不对齐,其中第一个图的刻度也不与条形图的中心对齐。

我尝试过在线查找,但找不到解决此问题的好资源。

在此处输入图片说明

约翰·C

一个问题是,颜色条占用了热图的空间,从而使其色图比条形图更窄。您可以创建一个2x2的网格来为颜色栏腾出空间,并删除空的子图。进行更改sharex=Truesharex='col'防止颜色栏获得与热图相同的x轴。

另一个问题是,热图的位置处有单元格边界0, 1, 2, ...,因此其中心位于0.5, 1.5, 2.5, ...您可以将条形图放在这些中心而不是默认位置:

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

fig, ((ax1, cbar_ax), (ax2, dummy_ax)) = plt.subplots(nrows=2, ncols=2, figsize=(26, 16), sharex='col',
                                                      gridspec_kw={'height_ratios': [5, 1], 'width_ratios': [20, 1]})
missings_df = np.random.rand(3, 3)
sns.heatmap(missings_df.T, cmap="Blues", cbar_ax=cbar_ax, xticklabels=False, linewidths=2, ax=ax1)

ax2.set_xlabel('Time (hours)')

patient_counts = np.random.randint(10, 50, 3)
x_ticks = ['Time1', 'Time2', 'Time3']
x_tick_pos = [i + 0.5 for i in range(len(x_ticks))]
ax2.bar(x_tick_pos, patient_counts, align='center')
ax2.set_xticks(x_tick_pos)
ax2.set_xticklabels(x_ticks)
dummy_ax.axis('off')

plt.tight_layout()
plt.show()

样例

PS:注意不要将“功能”接口与“面向对象”接口混合到matplotlib。因此,请尽量不要使用plt.xlabel()因为它显然不会应用于“当前”斧头(ax2在问题代码中)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

重塑pyplot子图

来自分类Dev

重塑pyplot子图

来自分类Dev

使用Seaborn和Matplotlib在热图和折线图的共享子图中对齐x轴刻度

来自分类Dev

matplotlib pyplot:子图大小

来自分类Dev

子图的pyplot绘制方法

来自分类Dev

Seaborn热图颜色图

来自分类Dev

使用seaborn热图

来自分类Dev

使用子图时,Seaborn热图宽度不匹配

来自分类Dev

熊猫和Seaborn-没有颜色的热图

来自分类Dev

Seaborn热图:y轴刻度和注释

来自分类Dev

Seaborn热图的顶部和底部部分被截断

来自分类Dev

使用python和seaborn从数据帧生成热图

来自分类Dev

热图Seaborn Annot错误

来自分类Dev

Seaborn 热图以失败告终

来自分类Dev

将颜色条添加到 Julia PyPlot 中的子图

来自分类Dev

pyplot反向x轴和反向表子图

来自分类常见问题

Matplotlib。将子图与Bbox对齐

来自分类Dev

Matplotlib。将子图与Bbox对齐

来自分类Dev

将Pyplot图转换为数组

来自分类Dev

子图中的seaborn热图的一个颜色条

来自分类Dev

Seaborn热图图中的离散图例

来自分类Dev

Seaborn热图:自定义标签

来自分类Dev

Seaborn热图关键词

来自分类Dev

Python-Seaborn:修改热图图例

来自分类Dev

使用Seaborn FacetGrid绘制相关热图

来自分类Dev

使用Seaborn扩大热图的大小

来自分类Dev

使用pandas数据框的seaborn热图

来自分类Dev

Seaborn热图按行排列颜色