首页 > 解决方案 > 直方图的逐渐填充(类似热图)

问题描述

我问人们吸烟了多少年,然后我计算了吸烟持续时间组的死亡风险。让我们假设这些数据:

df <- data.frame(years_smoke= c(1,2,2,3,3,3,4,5,6, 6,7, 10, 11, 12, 12, 14, 15),
risk_death= c(rep(.1, 8), rep(.3, 4), rep(.7, 5)))

在这里,连续变量 years_smoke 被分成三组(1 到 5 年、6 到 10 年和 11 到 15 年),每组都有一个死亡风险值(吸烟 1 到 5 年的人为 0.1,0.3对于那些吸烟 6 到 10 年的人和 0.7 对于曾经吸烟 11 到 15 年的人)。

我想将计数变量years_smoke 绘制为直方图,并按组的风险对列进行着色,例如热图,例如,低死亡风险为绿色,高死亡风险为红色。到目前为止,在评论(以及两个已删除的答案)中,有人提出了这样的建议:

library(ggplot2)
ggplot(df, aes(years_smoke, fill= factor(risk_death))) + geom_histogram()

但这并没有按预期工作。如果我们将数据更改为

data.frame(years_smoke= c(1,2,2,3,3,3,4,5,6, 6,7, 10, 11, 12, 12, 14, 15),
risk_death= c(rep(.1, 8), rep(.3, 4), rep(999, 5)))

我们会得到和以前一样的情节。但是在热图的情况下,这应该会导致颜色非常不同,其中所有风险为 0.1 和 .3 的列都具有几乎相同的绿色,而风险组 999 的颜色非常红色。此问题已标记为重复。但是提供的链接也没有像热图中那样给出颜色,因为使用了填充因子,其中颜色不依赖于连续变量的实际值。

(数据是编的)

标签: rggplot2histogramheatmap

解决方案


在这种情况下,建立自己的直方图可能是最简单的。您提到不会有相同年数的吸烟导致不同风险的情况,因此这样的事情应该可以解决问题:

library(tidyverse)    
df <- data.frame(years_smoke= c(1,2,2,3,3,3,4,5,6, 6,7, 10, 11, 12, 12, 14, 15),
                     risk_death= c(rep(.1, 8), rep(.3, 4), rep(.7, 5))) %>%
  group_by(years_smoke) %>%
  summarize(n = n(), risk_death = mean(risk_death))

df %>%
  ggplot(aes(x = years_smoke, y = n, fill = risk_death))+
    geom_col()

在此处输入图像描述

(取决于您的风险值实际上是另一个汇总函数,而不是平均值可能是合适的,但平均值适用于您的示例数据。)

例如,如果您现在将最后 5 个案例的风险从 0.7 更改为 10,您将获得所需的行为: 在此处输入图像描述


推荐阅读