喜欢这个?
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"))
谢谢!这是有效的,只是我不得不查找的东西,添加(“+主题(axis.text.x = element_text(angle = 90,hjust = 1))”)将使x轴文本不被扫描,这是我的情况。 – StudentOfScience
我选择了第一个选项,它对我所做的事情更有意义。但我想要一个彩色传说,你如何用第一种方法做到这一点?谢谢 – StudentOfScience
请参阅上面的编辑。 – jlhoward