2014-04-16 44 views
0

说你有两个dataframes[R小提琴的情节覆盖2个dataframes

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个dataframes像上面(但更大)一个不与3列如上述

的例子我曾尝试使用熔体中的意见,在这里看到: Violin plot of a data frame

但我不能让它将两张dataframes

帮助深表感谢:

回答

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(...)将数据帧从“宽”格式(5个不同列中的类别)重新组织为“长”格式(1列中的所有数据,称为value,其中第二列,称为variable)。

另一种方式来做到这首结合了这两种dataframes:

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的评论)

为了把填充颜色的一个传奇,你必须让他们的审美尺度的一部分:把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")) 

+0

谢谢!这是有效的,只是我不得不查找的东西,添加(“+主题(axis.text.x = element_text(angle = 90,hjust = 1))”)将使x轴文本不被扫描,这是我的情况。 – StudentOfScience

+0

我选择了第一个选项,它对我所做的事情更有意义。但我想要一个彩色传说,你如何用第一种方法做到这一点?谢谢 – StudentOfScience

+0

请参阅上面的编辑。 – jlhoward