ggplot2 - boxplot多个data.frames,同时保持有序

时间:2013-12-16 16:22:27

标签: r data-visualization ggplot2 boxplot

如果这更多是针对SO而不是简历,我道歉。

我试图将第二个箱图包含到现有的箱形图中,该框图按照绘制的值的平均值排序。当我从第二个data.frame包含boxplot(将控件样本表示到其他图表)时,原始图表将失去其排序。

以下是一个例子:

x1 <- data.frame("V1" = runif(100, 0, 100), "siteno" = "X1") #mean = 50.3
x2 <- data.frame("V1" = runif(100, 200, 450), "siteno" = "X2") #mean = 322.4
x3 <- data.frame("V1" = runif(100, 50, 150), "siteno" = "X3") #mean = 97.8
xData <- rbind(x1,x2,x3)
xData$siteno <- with(xData, reorder(siteno, V1, mean))

zData <- data.frame("V1" = runif(300, 0, 450), "siteno" = "Z1") #mean = 224.2

#orders xData correctly 
ggplot(xData, aes(x = siteno , y = V1)) +
stat_summary(fun.y=mean, colour="red", geom="point") +
geom_boxplot (aes(fill=siteno), alpha=.5, width=1, position = position_dodge(width = 1),  outlier.colour = "dark gray", outlier.size = 1)

这会生成下面的图,其中x个变量按平均值排序:

correctly ordered boxplots

如果我尝试下面的代码添加控制数据,则x变量的顺序将丢失:

x1 <- data.frame("V1" = runif(100, 0, 100), "siteno" = "X1") #mean = 50.3
x2 <- data.frame("V1" = runif(100, 200, 450), "siteno" = "X2") #mean = 322.4
x3 <- data.frame("V1" = runif(100, 50, 150), "siteno" = "X3") #mean = 97.8
xData <- rbind(x1,x2,x3)
xData$siteno <- with(xData, reorder(siteno, V1, mean))

zData <- data.frame("V1" = runif(300, 0, 450), "siteno" = "Z1") #mean = 224.2

#orders xData correctly 
ggplot(xData, aes(x = siteno , y = V1)) +
stat_summary(fun.y=mean, colour="red", geom="point") +
geom_boxplot (aes(fill=siteno), alpha=.5, width=1, position = position_dodge(width = 1), outlier.colour = "dark gray", outlier.size = 1) +
geom_boxplot(data=zData, aes(x = siteno , y = V1))

这会产生以下图,没有x变量的排序: incorrectly ordered boxplots

我的图表的要点是显示按其平均值排序的测试值,然后将控制值boxplot向右移动以供视觉参考。我想可能有一个结合xData和zData数据帧的解决方案;如果有一些建议,我愿意尝试。 感谢您的时间。

3 个答案:

答案 0 :(得分:2)

当您使用两个数据帧在一个图中组合数据时,原始级别(和顺序)将丢失,并且将使用比两个数据帧中的数据组合的新级别。您没有为填充值获取此行为,因为您没有为第二个数据框提供填充参数。但对于离散x标度,两个数据帧都会合并,新级别为X1X2X3Z1

如果没有从所有值中创建一个数据框,您可以使用scale_x_discrete(),然后在参数limits=中使用函数levels()来获取siteno级别的原始顺序并将其合并Z1作为参考水平。

ggplot(xData, aes(x = siteno , y = V1)) +
  stat_summary(fun.y=mean, colour="red", geom="point") +
  geom_boxplot (aes(fill=siteno), alpha=.5, outlier.colour = "dark gray", 
                                                  outlier.size = 1) +
  geom_boxplot(data=zData, aes(x = siteno , y = V1))+
  scale_x_discrete(limits=c(levels(xData$siteno),"Z1")) 

enter image description here

答案 1 :(得分:1)

为什么不将它们全部添加到一个data.frame中并在其中排序所有4个级别?

data2 <- rbind(xData, zData)
ggplot(data2, aes(x = siteno , y = V1)) +
stat_summary(fun.y=mean, colour="red", geom="point") +
geom_boxplot (aes(fill=siteno), alpha=.5, width=1, 
              position = position_dodge(width = 1), 
              outlier.colour = "dark gray", outlier.size = 1)

enter image description here

答案 2 :(得分:0)

捕获所需的顺序,例如:

 ord <- xvars[order(mean(xvars))]

然后使用scale_x_discrete()