ggplot:将小提琴添加到折线图中

时间:2016-10-15 10:11:17

标签: r ggplot2 data-visualization

我在ggplot中绘制线图。每行对应一个人及其随时间的发展。一个简化的,可重现的例子:

dat <- data.frame(x=rep(1:10, 10), y=rnorm(100), person=rep(LETTERS[1:10], each=10))
ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person))

产生:

enter image description here

我想在x = 11处添加一把小提琴,以显示y轴上描绘的值的整体分布。

如果我在ggplot调用中添加+ geom_violin(),则会在x的每个值处绘制一个小提琴(这是有意义的)。但我想要的是加上ggplot(dat, aes(x, y)) + geom_violin()带来的小提琴。

如何在单个图中合并这两个geom_以全面了解我的数据?

编辑:我让它与geom_errorbar一起工作,但是用小提琴不能得到类似的东西:

ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person)) + 
  geom_errorbar(aes(x=11, ymax=mean(dat$y)+sd(dat$y), ymin=mean(dat$y)-sd(dat$y))) + 
  geom_point(aes(x=11, y=mean(dat$y)), size=4)

这给了我这个:

enter image description here

理想情况下,我想要一把小提琴而不是误差条来更好地反映分布。

2 个答案:

答案 0 :(得分:2)

您需要在group = 1的{​​{1}}内使用aes

geom_violin

这给出了:

enter image description here

要在线图旁边绘制小提琴,您可以使用ggplot(dat, aes(x, y)) + geom_line(aes(color = person)) + geom_violin(aes(group = 1), fill = NA, size = 1.5) + theme_minimal() 包中的grid.arrange

gridExtra

给出:

enter image description here

然而,线条和小提琴图现在由图例分开。用:

p1 <- ggplot(dat, aes(x, y)) + 
  geom_line(aes(color = person)) + 
  theme_minimal(base_size = 14)
p2 <- ggplot(dat, aes(x, y)) + 
  geom_violin(fill = NA) + 
  theme_minimal(base_size = 14) + 
  theme(axis.title = element_text(color = NA),
        axis.text = element_text(color = NA))

library(gridExtra)
grid.arrange(p1, p2, ncol=2, widths = c(4,1))

您可以将图例再次放置在图表的最右侧:

enter image description here

答案 1 :(得分:1)

我明白了:

ggplot(dat, aes(x, y, group=person)) + geom_line(aes(color=person)) + 
  geom_violin(aes(x=rep(11, nrow(dat)), y=y, group=1))

注意事项:在aes(x=11, y=y)中设置geom_violin()不起作用,因为(a)x和y必须具有相同的长度,(b)你会得到10把小提琴。

(a)可以通过rep()数字来避免创建一个长度等于y的向量,并且(b)通过设置group = 1来避免(如前所述) Procrastinatus Maximus'回答)。

结果图:

enter image description here

如果有更好的解决方案,我很乐意看到它!