R小提琴图覆盖2个数据帧

时间:2014-04-16 19:24:49

标签: r plot ggplot2

假设您有两个数据帧

M1 <- data.frame(sample(1:3, 500, replace = TRUE), ncol = 5)
M2 <- data.frame(sample(1:3, 500, replace = TRUE), ncol = 5)

我希望将它们叠加为小提琴图,如下所示: Overlay violin plots ggplot2

但我有2个像上面这样的数据帧(但更大),而不是像上面的例子那样有3列的数据框

我已尝试过使用融合的建议,如下所示: Violin plot of a data frame

但我无法覆盖两个数据帧

非常感谢帮助:

1 个答案:

答案 0 :(得分:2)

喜欢这个吗?

library(ggplot2)
library(reshape2)
set.seed(1)
M1 <- data.frame(matrix(sample(1:5, 500, replace = TRUE), ncol = 5))
M2 <- data.frame(matrix(sample(2:4, 500, replace = TRUE), ncol = 5))
M1.melt <- melt(M1)
M2.melt <- melt(M2)
ggplot() +
  geom_violin(data=M1.melt, aes(x=variable,y=value),fill="lightblue",colour="blue")+
  geom_violin(data=M2.melt, aes(x=variable,y=value),fill="lightgreen",colour="green")

有几个问题。首先,data.frame(...)没有采用ncol参数,因此您的代码只生成一对2列数据框,第二列名为ncol,所有值均为5.如果您需要5列(你呢?)然后你必须使用上面的matrix(...)

其次,您需要使用melt(...)重新组织来自&#34; wide&#34;的数据帧。格式(5个不同列中的类别)到&#34; long&#34; format(1列中的所有数据,称为value,其类别由第二列distinguihsed,称为variable)。

另一种方法是首先组合两个数据帧:

M3 <- rbind(M1,M2)
M3$group <- rep(c("A","B"),each=100)
M3.melt <- melt(M3, id="group")
ggplot(M3.melt, aes(x=variable, y=value, fill=group)) + 
  geom_violin(position="identity")

请注意,这会产生略微不同的情节,因为ggplot会将小提琴的宽度缩放在一起,而在之前的情节中,它们会分别缩放。

编辑(对OP&#39评论的回应)

要将填充颜色放在图例中,您必须将它们作为审美尺度的一部分:将fill=...置于aes(...)的调用中,如下所示。

ggplot() +
  geom_violin(data=M1.melt, aes(x=variable,y=value,fill="M1"),colour="blue")+
  geom_violin(data=M2.melt, aes(x=variable,y=value,fill="M2"),colour="green")+
  scale_fill_manual(name="Data Set",values=c(M1="lightblue",M2="lightgreen"))