ggplot2 - 在保持顺序的情况下绘制多个数据框的箱线图

5

如果这个问题更适合提交到SO而不是CV,我向大家道歉。

我正在尝试将第二个箱线图添加到一个已有的箱线图中,并按照绘制的值的均值进行排序。但当我将第二个数据框中的箱线图(代表与其他绘图相比的对照样本)包含进来时,原始绘图就失去了排序。

以下是一个例子:

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变量的图表:

正确排序的箱线图

如果我尝试使用以下代码添加控制数据,则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

我的图表的重点是按其平均值排序显示测试值,然后在右侧为视觉参考框绘制控制值。我想象中可能有一种解决方案,结合xData和zData数据帧; 如果有建议,我愿意尝试那个。 谢谢你的时间。


为什么不在 ggplot 列表上询问呢? - Peter Flom
3个回答

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


感谢您提供的解决方案和出色的解释。scale_x_discreet 的效果非常好。 - Mr.ecos

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


1
谢谢你提供这个有用的想法。我使用了以前的解决方案,这样我就可以更好地控制控制样本箱线图的外观。但毫无疑问,你的方法将在未来派上用场。 - Mr.ecos

0

捕获所需的顺序,例如:

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

然后使用 scale_x_discrete()

谢谢你,Ricardo。你的解决方案,就像上面的Didzis一样,非常有效。 - Mr.ecos

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