【问题标题】:Gradual fill for a histogram (heatmap like)直方图的逐渐填充(类似热图)
【发布时间】:2019-08-29 13:18:49
【问题描述】:

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

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 , .3 对于那些吸烟 6 到 10 年的人和 0.7 对于曾经吸烟 11 到 15 年的人)。

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

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 和 0.3 的所有列都具有几乎相同的绿色,而风险组 999 具有非常红色的颜色。此问题已标记为重复。但是提供的链接也没有像热图中那样给出颜色,因为使用了填充因子,其中颜色不依赖于连续变量的实际值。

(数据是编出来的)

【问题讨论】:

  • 我不明白如何从单个标量变量绘制有意义的热图。你最后的情节对我来说没有意义。
  • @ziggystar 最后一张图显示,更高的 x 值风险正在增加。我为此添加了一个图例。当然,直方图通常看起来不是那样的。我生成了一个均匀分布,因为这很容易用 rep(...) 来完成。但分布与问题无关。
  • 你想要一个柱状图,柱的高度显示不同风险级别的频率吗?这将是一个直方图,其条形颜色与 x 比例成正比。
  • @ziggystar 我需要一个直方图,其中列的高度反映了连续变量 x 的计数,并且直方图应该像热图一样着色,具体取决于另一个连续变量风险。我添加了一个图例。

标签: r ggplot2 histogram heatmap


【解决方案1】:

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

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

【讨论】:

  • 这太棒了!非常感谢! @“比平均值可能合适的汇总函数”:是的。事实上,由于对于每一组 years_smoke 只有一个风险值,使用 mean() 或 unique() 为我的数据提供相同的输出。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2015-04-04
  • 2018-10-14
  • 1970-01-01
相关资源
最近更新 更多