我正在尝试创建一个带有密度叠加层的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的值计算的。我希望将它们作为一组计算。
我想念什么?
答案 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()
可以分为两组并使用alpha
,但是基本上需要您预先计算直方图和密度曲线。很好,但这会付出很多额外的努力,而视觉增益却很小。
当然,如果theme_josh
具有自定义的背景颜色和奇怪的网格线,则此方法可能不太有效。只要将填充颜色设置为面板背景,就应该得到不错的结果。 (我认为默认的ggplot面板是“ gray90”或“ gray95”)