基于ggplot2的叠加小提琴图

7
我希望能画出两组各含十个小提琴图的图表,将它们叠在一起:
library(ggplot2)
#generate some data

coco1<-rnorm(10000,0,1)
coco2<-c(runif(10000))
decile<-rbinom(10000,9,1/2)+1
coconut<-data.frame(coco1,coco2,decile)

#draw the violin plots of the coco1 serie
p <- ggplot(coconut, aes(factor(decile), coco1))
p<-p + geom_violin(aes(alpha=0.3,colour="#1268FF"))
p

#draw the violin plots of the coco2 serie
q <- ggplot(coconut, aes(factor(decile), coco2))
q<-q + geom_violin(aes(alpha=0.3,colour="#3268FF"))
q

我想在同一张图上绘制小提琴图 "p" 和 "q",并且希望每个 "q" 的小提琴图位于对应的 "p" 的小提琴图之上。

2个回答

12
你可以将第二个图的 geom_violin 添加到第一个图中:
p <- ggplot(coconut, aes(factor(decile), coco1))
p <- p + geom_violin(aes(colour = "#1268FF"), alpha = 0.3)
q <- p + geom_violin(aes(y = coco2, colour = "#3268FF"), alpha = 0.3)

现在,q 包含了两个小提琴的版本。 enter image description here

顺便说一下:如果您想要去掉颜色图例,必须将 colour 指定在 aes 之外。


不错的例子(+1),经常做这个的方法是反映其中一组的分布,因为密度是对称的。我在评论中给出了一个做法的例子,http://mbjoseph.github.io/blog/2013/06/24/violin/。人们可能还想考虑不同的加权方案;在这个例子中,蓝色和红色的组应该具有相等的面积,因为它们具有相等的样本大小。 - Andy W

3

另一种方法是将position设置为"identity"。这个例子还使用了tidyr::gather来移动data.frame,以便更容易在ggplot中绘图。

library(ggplot2)

coco1<-rnorm(10000,0,1)
coco2<-c(runif(10000))
decile<-rbinom(10000,9,1/2)+1
coconut<-tidyr::gather(
    data.frame(coco1,coco2,decile),
    name,value,coco1,coco2)

p <- ggplot(coconut)+
    aes(x=factor(decile),y=value,color=name)+
    geom_violin(alpha=0.3,position="identity")
p

ggsave("example_identity.png",p)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接