11

我有两个绘制的数据集(df1df2)。

df1 = data.frame(x=c(1:10), y=c(1:10))
df2 = data.frame(x=c(0:13), y=c(0:13)^1.2)

# plot
plot(df1)
# add lines of another dataset
lines(df2)

的某些值df2超出了绘图范围,因此不可见。(在这个例子中,我可以先绘制df2)。我通常会尝试找出我的数据的范围,如下所示。

# manual solution
minX = min(df1$x, df2$x)
minY = min(df1$y, df2$y)
maxX = max(df1$x, df2$x)
maxY = max(df1$y, df2$y)

plot (df1, xlim=c(minX, maxX), ylim=c(minY, maxY))
lines(df2)

当有许多数据集时,这变得很烦人。我想知道是否有更简单的方法来调整轴的范围。在第一步中,R 自己找到轴范围。当添加新数据集时,R 是否还有一种方法可以调整轴范围?

4

4 回答 4

3

You could use range to calculate the limits.

Imho, a better solution:

df1 <- data.frame(x=c(1:10), y=c(1:10))
df2 <- data.frame(x=c(0:13), y=c(0:13)^1.2)

ll <- list(df1,df2)

ll <- lapply(1:length(ll),function(i) {res <- ll[[i]]; res$grp <- i; res})

df <- do.call("rbind",ll)
df$grp <- factor(df$grp)

library(ggplot2)
p1 <- ggplot(df,aes(x=x,y=y,group=grp,col=grp)) + geom_line()
p1
于 2012-11-08T12:06:02.013 回答
3

我喜欢@Roland 的解决方案,但这是@Glen_b 解决方案的扩展,适用于任意数量的数据集,如果您将它们全部放在一个列表中。

警告:未经测试!)

dflist <- list(df1,df2,df3,...)  ## dots are not literal!
plotline <- function(L,...) {    ## here the dots are literal
  ## use them to specify (e.g.) xlab, ylab, other arguments to plot()
  allX <- unlist(lapply(L,"[[","x"))
  allY <- unlist(lapply(L,"[[","y"))
  plot (df1, xlim=range(allX), ylim=range(allY),type="n",...)
  invisible(lapply(L,lines))
}

这假设您希望将所有数据集绘制为线条。如果您想开始指定单独的颜色、点类型等,您可以扩展此功能——但您将开始重新发明latticeandggplot2包。

(如果您的所有数据集大小相同,则应考虑matplot

于 2012-11-08T14:49:58.017 回答
2

你总是可以写一个函数:

plotline <- function(df1,df2) {

  minX = min(df1$x, df2$x)
  minY = min(df1$y, df2$y)
  maxX = max(df1$x, df2$x)
  maxY = max(df1$y, df2$y)

  plot (df1, xlim=c(minX, maxX), ylim=c(minY, maxY))
  lines(df2)
}

然后你就这样做:

plotline(firstdf,seconddf)

如果你想变得花哨,你甚至可以包含参数...并将其传递给 plot 调用。

于 2012-11-08T11:23:03.997 回答
0

查看matplot函数,它将接受一个矩阵作为 x、y 或两者,并为您执行所有自动范围计算。如果您有多个数据帧中的数据,那么您可以使用 sapply 来提取关键部分并形成矩阵。

这种方法通常比多次使用 lines 函数更简单:

df1 <- data.frame(x=1:10, y=1:10)
df2 <- data.frame(x=0:13, y=(0:13)^1.2)
df3 <- data.frame(x= -3:5, y= 5:(-3))

mylist <- list( df1, df2, df3 )
max.n <- max(sapply(mylist,nrow))
tmpfun <- function(df, which.col, n) {
    tmp <- df[[which.col]]
    c(tmp, rep(NA, n-length(tmp)))
}

matplot( sapply(mylist, tmpfun, which.col='x', n=max.n),
        sapply(mylist, tmpfun, which.col='y', n=max.n), type='b' )

如果所有数据帧都具有相同的行数,则上述内容甚至更简单。

评论中提到的另一种方法是将数据集组合成一个数据集,并使用格子图形或 ggplot2 等工具:

lengths <- sapply(mylist, nrow)
df.all <- do.call(rbind, mylist)
df.all$group <- rep( seq_along(lengths), lengths )

library(lattice)
xyplot( y~x, data=df.all, groups=group, type='b' )

library(ggplot2)
qplot(x,y, colour=factor(group), data=df.all, geom=c('point','path') )

如果一切都失败了,您可以使用zoomplotTeachingDemos 包中的功能来更改基础图形的限制,但上述方法要好得多。

于 2012-11-08T17:28:21.323 回答