qqnorm绘制多个子集

时间:2013-12-26 08:32:09

标签: r

我是R的新手。我已经想出了如何在我的数据帧的子集上绘制qqnorm图。但是,我想在由两个因子定义的子集上绘制qqnorm图(一个因子有48个类别(brain_region),每个类别可以进一步细分为另一个因子,它有三个级别(GroupID) )。我尝试过以下方法:

by(t, t[,"GroupID"], function(x) tapply(t$FA,t$brain_region,qqnorm))

但它似乎没有用。我也不确定这是否是最好的方法,因为我是这个程序的新手。

我还想保存每个单独生成的qqnorm图,其中x轴标记为“FA”,标题具有两个因子(脑区域/ GroupID)中每一个的特定级别。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

绘图是apply不是最佳解决方案的少数事情之一。 ggplot为您提供了足够的可能性,如in this answer所示。

一次性绘制所有级别

如果您使用基础图,则可以更好地使用for循环。另外,如果您想在同一图形设备上绘制不同的图表,可以使用例如par(mfrow=)layout(请参阅帮助页?layout

我们以内置数据集iris为例:

data(iris)

op <- par(mfrow=c(1,3))
for(i in levels(iris$Species)){
  tmp <- with(iris, Petal.Width[Species==i])
  qqnorm(tmp,xlab="Petal.Width",main=i)
  qqline(tmp)
}
par(op)
rm(i,tmp)

给出:

enter image description here

使用for循环后,请不要忘记清理工作区。不是强制性的,但它可以防止以后的严重混淆。

结合两个因素

为了同时为2个因子级别完成此操作,您可以构建嵌套的for - 循环,或将两个因子组合成单个因子。拿数据集mtcars:

data(mtcars)
mtcars$cyl <- factor(mtcars$cyl)
mtcars$am <- factor(mtcars$am,
                    labels=c('automatic','manual'))

要结合这两个级别,您可以使用这个简单的结构:

mtcars$combined <- factor(paste(mtcars$cyl,mtcars$am,sep='/'))

然后再做同样的事情。使用两个for循环,您的代码就像下面的代码一样。请注意,这只有在您拥有每个因素组合的数据时才有效,并且您没有太多级别。如果您有很多级别,最好使用例如png()(请参阅?png获取信息)保存图表,而不是将它们全部绘制在同一图形设备上。

lcyl <- levels(mtcars$cyl)
lam <- levels(mtcars$am)

par(mfrow=c(length(lam),length(lcyl)))

for(i in lam){
  for(j in lcyl){
    tmp <- with(mtcars,mpg[am==i & cyl==j])
    qqnorm(tmp,xlab="Petal.Width",
           main=paste(i,j,sep="/"))
    qqline(tmp)    
  }
}

给出:

enter image description here