11

プロットされた2 つのデータセット (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 が軸範囲を調整する方法もありますか?

4

4 に答える 4

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

これは、すべてのデータセットを線として描画することを前提としています。個別の色やポイントタイプなどの指定を開始したい場合は、この関数を拡張できますが、その時点でlatticeとパッケージを再発明し始めます。ggplot2

(すべてのデータセットが同じサイズの場合は、検討する必要がありますmatplot

于 2012-11-08T14:49:58.017 に答える
3

range制限を計算するために使用できます。

私見、より良い解決策:

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 に答える
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') )

他のすべてが失敗した場合はzoomplot、TeachingDemos パッケージの機能を使用して事後に基本グラフィックスの制限を変更できますが、上記の方法の方がはるかに優れています。

于 2012-11-08T17:28:21.323 に答える