如何在ggplot2中绘制一组旋转密度?

时间:2016-06-04 20:14:52

标签: r plot graphics ggplot2

我有一系列正态分布的后验密度来自贝叶斯更新关于模型中参数的信念。假设后验的均值和标准差的序列是

mean <- c(5,4,3,2,1)
sd <- c(7,6,5,4,3)

在分布N(5,7)是第一个后部的情况下,N(4,6)是第二个后部,依此类推。我想将它们绘制成一系列密度,以便轴旋转(分布的支持从底部到顶部),并且密度从左到右依次排列。我理解如何使用stat_function绘制密度,以及如何使用facet_grid将绘图放在facet中,但我正在努力将它们组合在一起。

1 个答案:

答案 0 :(得分:2)

这是你的想法:

library(reshape2)
library(ggplot2)

m <- c(5,4,3,2,1)
s <- c(7,6,5,4,3)
x=seq(-20,30,0.1)

# Create a data frame of density values
dat = data.frame(x, mapply(function(m,s) {dnorm(x, m, s)}, m, s))
names(dat) = c("x", paste0("Mean=",m," SD=",s))

ggplot(melt(dat, id.var="x"), aes(x, value)) +
  geom_line() + 
  coord_flip() + 
  facet_grid(. ~ variable) +
  theme_bw()

enter image description here

或者用美学而不是刻面:

ggplot(melt(dat, id.var="x"), aes(x, value, color=variable)) +
  geom_line() + labs(color="") + 
  coord_flip() + 
  theme_bw()

enter image description here

最初,我试图在不创建单独数据框的情况下进行此操作。这是一种方法,但我不太确定如何使用这种方法映射到颜色美学或方面(this SO answer from @hadley表明这是不可能的(虽然那是六年前,也许是情况现在不同了)):

ggplot(data.frame(x), aes(x)) + 
  mapply(function(m, s) {
    stat_function(fun = dnorm, args = list(mean = m, sd = s))
  }, m = m, s = s) + 
  coord_flip()