向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') )