直方图的逐渐填充(类似热图)

Gradual fill for a histogram (heatmap like)

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

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 年),每组都有一个死亡风险值(0.1吸烟 1 至 5 年的人,吸烟 6 至 10 年的人 .3 和 11 至 15 年吸烟者的 .7)。

我想将连续变量 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)))

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

(资料整理)

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

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,您将获得所需的行为: