首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot2 -按顺序绘制多个data.frames

问ggplot2 -按顺序绘制多个data.frames
EN

Stack Overflow用户
提问于 2013-12-16 16:22:27
回答 3查看 9.2K关注 0票数 5

如果这不是简历,而是更多的原因,我很抱歉。

我试图将第二个框图包含到现有的盒图中,该框图是按所绘制的值的平均值排序的。当我包含来自第二个data.frame的框图(将一个控制示例表示到其他绘图)时,原始图就会放松它的顺序。

以下是一个例子:

代码语言:javascript
复制
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变量的顺序就会丢失:

代码语言:javascript
复制
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变量排序:

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-16 17:17:10

当您使用两个数据帧在一个图中组合数据时,原始级别(和顺序)将丢失,并且将使用新的级别,而不是从两个数据帧中组合的数据。由于没有为第二个数据框架提供填充参数,所以无法获得填充值的这种行为。但对于离散x尺度,这两种数据帧都是组合的,新的层次是X1、X2、X3和Z1。

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

代码语言:javascript
复制
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")) 

​

​

票数 2
EN

Stack Overflow用户

发布于 2013-12-16 17:17:19

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

代码语言:javascript
复制
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)

​

​

票数 1
EN

Stack Overflow用户

发布于 2013-12-16 17:17:23

获取所需的订单(如:

代码语言:javascript
复制
 ord <- xvars[order(mean(xvars))]

然后使用scale_x_discrete()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20616531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档