重叠的直方图和具有不同alpha值的密度

时间:2020-09-23 21:10:16

标签: r ggplot2

我正在尝试创建一个带有密度叠加层的ggplot直方图,其中alpha更改为数字1。可以在我们的模拟部分的每一个结果下on 538下看到一个示例。 Alpha因选举投票数而异。我即将获得类似的图形,但是我无法弄清楚如何使密度和直方图协同工作。

代码

library(data.table)
library(ggplot2)
dt <- data.table(ratio = rnorm(10000, mean = .5, sd = 1))

dt[, .(ratio,
          al = (ratio >= 1))] %>% 
  ggplot(aes(x = ratio, alpha = al)) +
  geom_histogram(aes(), bins = 100,
                 fill = 'red') +
  geom_density(aes(),size = 1.5,
               color = 'blue') +
  geom_vline(xintercept = 1,
             color = '#0080e2', 
             size = 1.2) +
  scale_alpha_discrete(range = c(.65, .9))

此尝试可根据需要正确地将alpha更改为1以上,但密度估计未缩放。

dt[, .(ratio,
       al = (ratio >= 1))] %>% 
  ggplot(aes(x = ratio)) +
  geom_histogram(aes(y = ..density.., alpha = al), bins = 100,
                 fill = 'red') +
  geom_density(aes(y = ..scaled..),size = 1.5,
               color = 'blue',) +
  geom_vline(xintercept = 1,
             color = '#0080e2', 
             size = 1.2) +
  scale_alpha_discrete(range = c(.65, .9))

这种尝试可以正确地缩放密度曲线,但是现在,geom_histogram是分别针对小于1和大于1的值计算的。我希望将它们作为一组计算。

我想念什么?

1 个答案:

答案 0 :(得分:1)

了解主题很重要的原因是,有一个简单的快捷方式,不是使用字母而是使用em,而是在绘图的左半部分绘制一个半透明的矩形:

library(data.table)
library(ggplot2)
library(dplyr)

data.table(ratio = rnorm(10000, mean = .5, sd = 1)) %>%
  ggplot(aes(x = ratio)) +
  geom_histogram(aes(y = ..density..), bins = 100,
                 fill = 'red') +
  geom_line(aes(), stat = "density", size = 1.5,
               color = 'blue') +
  geom_vline(xintercept = 1,
             color = '#0080e2', 
             size = 1.2) +
  annotate("rect", xmin = -Inf, xmax = 1, ymin = 0, ymax = Inf, fill = "white",
           alpha = 0.5) +
  theme_bw()

enter image description here

可以分为两组并使用alpha,但是基本上需要您预先计算直方图和密度曲线。很好,但这会付出很多额外的努力,而视觉增益却很小。

当然,如果theme_josh具有自定义的背景颜色和奇怪的网格线,则此方法可能不太有效。只要将填充颜色设置为面板背景,就应该得到不错的结果。 (我认为默认的ggplot面板是“ gray90”或“ gray95”)