我在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))
产生:
我想在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)
这给了我这个:
理想情况下,我想要一把小提琴而不是误差条来更好地反映分布。
答案 0 :(得分:2)
您需要在group = 1
的{{1}}内使用aes
:
geom_violin
这给出了:
要在线图旁边绘制小提琴,您可以使用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
给出:
然而,线条和小提琴图现在由图例分开。用:
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))
您可以将图例再次放置在图表的最右侧:
答案 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'回答)。
结果图:
如果有更好的解决方案,我很乐意看到它!