首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用木作图绘制三因素图

用木作图绘制三因素图
EN

Stack Overflow用户
提问于 2011-04-17 08:22:21
回答 2查看 2.9K关注 0票数 4

我遇到了一个无法解决的问题,所以也许这里的人可以指出原因。对不起,我无法上载我的数据集,但是下面可以找到一些数据描述。图形的输出如下所示,除了没有行外,其他所有的东西都是可以的。

代码语言:javascript
复制
> all.data<-read.table("D:/PAM/data/Rural_Recovery_Edit.csv",head=T,sep=",")
> all.data$Water<-factor(all.data$Water,labels=c("W30","W60","W90"))
> all.data$Polymer<-factor(all.data$Polymer,labels=c("PAM-0  ","PAM-10  ","PAM-40  "))
> all.data$Group<-factor(all.data$Group,labels=c("Day20","Day25","Day30"))
> dat<-data.frame(Waterconsump=all.data[,9],Water=all.data$Water,Polymer=all.data$Polymer,Age=all.data$Group)

> ggplot(dat,aes(x=Water,y=Waterconsump,colour=Polymer))+
+ stat_summary(fun.y=mean, geom="line",size=2)+
+ stat_summary(fun.ymin=min,fun.ymax=max,geom="errorbar")+#,position="dodge"
+ facet_grid(~Age)

> dim(dat)
[1] 108   4
> head(dat)
  Waterconsump Water  Polymer   Age
1         10.5   W30 PAM-10   Day20
2         10.3   W30 PAM-10   Day20
3         10.1   W30 PAM-10   Day20
4          7.7   W30 PAM-10   Day20
5          8.6   W60 PAM-10   Day20
6          8.4   W60 PAM-10   Day20
> table(dat$Water)

W30 W60 W90 
 36  36  36 
> table(dat$Polymer)

 PAM-0   PAM-10   PAM-40   
      36       36       36 
> table(dat$Age)

Day20 Day25 Day30 
   36    36    36 

而且,如果我将geom改为"bar",则输出是OK的。

代码语言:javascript
复制
below is the background for this Q

我想画出几个受相同因素影响的变量,3个因素。使用木偶图,我可以绘制其中的两个,在一个数字内。然而,我不知道如何包括第三个,并将数字排列成N个子图(N等于第三个因素的水平数)。因此,我的目标是:

  1. 绘制第三个因子,并将其划分为N个子图,其中N是第三个因子的水平。
  2. 更适合作为一个函数工作,因为我需要绘制几个变量。下面是只有两个因素的示例图,而我的工作示例则显示了2个因素。

提前感谢~

马可

代码语言:javascript
复制
library(reshape)
library(agricolae)
library(lattice)
yr<-gl(10,3,90:99)
trt<-gl(4,75,labels=c("A","B","C","D"))

third<-gl(3,100,lables=c("T","P","Q")) ### The third factor to split the figure in to 4 subplots

dat<-cbind(runif(300),runif(300,min=1,max=10),runif(300,min=100,max=200),runif(300,min=1000,max=1500))
colnames(dat)<-paste("Item",1:4,sep="-")
fac<-factor(paste(trt,yr,sep="-"))
dataov<-aov(dat[,1]~fac)
dathsd<-sort_df(HSD.test(dataov,'fac'),'trt')
trtplt<-gl(3,10,30,labels=c("A","B","C"))
yrplt<-factor(substr(dathsd$trt,3,4))

prepanel.ci <- function(x, y, ly, uy, subscripts, ...) 
{ 
    x <- as.numeric(x) 
    ly <- as.numeric(ly[subscripts]) 
    uy <- as.numeric(uy[subscripts]) 
    list(ylim = range(y, uy, ly, finite = TRUE)) 
} 
panel.ci <- function(x, y, ly, uy, subscripts, pch = 16, ...) 
{ 
    x <- as.numeric(x) 
    y <- as.numeric(y) 
    ly <- as.numeric(ly[subscripts]) 
    uy <- as.numeric(uy[subscripts]) 
    panel.arrows(x, ly, x, uy, col = "black", 
                 length = 0.25, unit = "native", 
                 angle = 90, code = 3) 
    panel.xyplot(x, y, pch = pch, ...) 
} 

xyplot(dathsd$means~yrplt,group=trtplt,type=list("l","p"),
        ly=dathsd$means-dathsd$std.err,
        uy=dathsd$means+dathsd$std.err,
        prepanel = prepanel.ci, 
        panel = panel.superpose, 
        panel.groups = panel.ci 
        )

好了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-17 12:15:30

下面是另一种方法,使用ggplot的魔力。因为ggplot将为您计算摘要,所以我怀疑这意味着您可以跳过执行aov的整个步骤。

关键是您的数据应该在单个data.frame中,您可以将其传递给ggplot。请注意,我已经创建了新的示例数据来演示。

代码语言:javascript
复制
library(ggplot2)

df <- data.frame(
  value = runif(300),
  yr = rep(1:10, each=3),
  trt = rep(LETTERS[1:4], each=75),
  third = rep(c("T", "P", "Q"), each=100)
)

ggplot(df, aes(x=yr, y=value, colour=trt)) + 
  stat_summary(fun.y=mean, geom="line", size=2) +
  stat_summary(fun.ymin=min, fun.ymax=max, geom="errorbar") +
  facet_grid(~third)

您可以更进一步,在两个维度中生成方面:

代码语言:javascript
复制
ggplot(df, aes(x=yr, y=value, colour=trt)) + 
  stat_summary(fun.y=mean, geom="line", size=2) +
  stat_summary(fun.ymin=min, fun.ymax=max, geom="errorbar") +
  facet_grid(trt~third)

票数 7
EN

Stack Overflow用户

发布于 2011-04-17 09:34:56

这一点非常接近,但我忘记了如何使用格子中的group变量对错误行进行着色,而Deepayan的书正在起作用。

代码语言:javascript
复制
## format a new data structure with all variables we want
dat <- data.frame(dathsd[, c(2,5)], treat = trtplt, yrplt = yrplt,
                  upr = dathsd$means + 2 * dathsd$std.err,
                  lwr = dathsd$means - 2 * dathsd$std.err)
## compute ylims
ylims <- range(dat$lwr, dat$upr)
ylims <- ylims + (c(-1,1) * (0.05 * diff(ylims)))
## plot
xyplot(means ~ yrplt, data = dat, group = treat, lwr = dat$lwr, upr = dat$upr,
       type = c("p","l"), ylim = ylims,
       panel = function(x, y, lwr, upr, ...) {
           panel.arrows(x0 = x, y0 = lwr, x1 = x, y1 = upr,
                        angle = 90, code = 3, length = 0.05)
           panel.xyplot(x, y, ...)
       })

并产生:

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

https://stackoverflow.com/questions/5692428

复制
相关文章

相似问题

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