向R中的绘图添加新曲线时,调整x轴和y轴的限制

向R中的绘图添加新曲线时,调整x轴和y轴的限制,r,plot,range,R,Plot,Range,我有两个绘制的数据集(df1和df2) 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(df

我有两个绘制的数据集(
df1
df2

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调整轴范围的方法?

您始终可以编写一个函数:

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)
}

如果你想变得有趣,你甚至可以包含参数
,并将其传递给绘图调用。

你可以使用
范围
来计算限制

Imho,更好的解决方案:

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

df1我喜欢@Roland的解决方案,但这里是@Glen_b解决方案的一个扩展,它适用于任意数量的数据集,如果列表中都有这些数据集的话

(警告:未经测试!)


dflist查看
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' )

df1合并
数据。帧
,创建一个组变量,使用
ggplot2
@Roland:我不认为合并不同长度的数据帧可以解决问题。什么是组变量?解决方案在ggplot2中如何(我以前从未使用过)我有时在一个绘图中有20个数据集,因此
plotline
-函数无法工作。绘图中使用的
参数是什么?或者您是指自己的plotline函数吗?修改该函数很容易,可以从数据帧、数据帧列表、矩阵或指定要打印的一组内容的任何其他方法中获取列的子集。至于
参数,它是一种将附加参数向下传递到函数调用内容的方法(在本例中,为plot,因此plotline允许您设置plot允许您设置的任何内容)。参见“R简介”第10.4节。
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))
}
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' )
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') )