0

R 最让我烦恼的一件事是绘图、点和线命令的分离。如果您最初未能正确设置 ylim 和 xlim ,则必须将情节更改为第一个情节的任何变体,并且必须从头开始重新绘制,这有点令人恼火。有一个命令不是很好:

  1. 通过参数选择线、点或两者,如plot(..., type = "l")

  2. 默认情况下,根据当前设备是否为空来选择是创建一个新的绘图,还是添加到现有的绘图。

  3. 如果添加到绘图的元素超出当前范围,则自动重新缩放轴。

有没有人做过这样的事情?如果没有,并且没有充分的理由说明这是不可能的,我稍后会自己回答这个问题......

4

2 回答 2

1

一些可能有助于您想要的功能:

matplot函数使用基本图形,将一步绘制多组点或线,一步确定正确的范围。

update一种用于点阵图形的方法,可用于添加/更改绘图中的内容,因此会导致自动重新计算限制和轴等内容。

如果您向 ggplot2 绘图添加附加信息(使用+),则将重新计算自动计算的内容。

您已经找到zoomplot并且总是有像您一样编写自己的函数的方法。

于 2012-10-23T16:52:34.120 回答
0

无论如何,这就是我想出的:(它使用zoomplotfrom TeachingDemos

 fplot <- function(x, y = NULL, type = "l", new = NULL, xlim, ylim, zoom = TRUE,...){
   require(TeachingDemos)
   if (is.null(y)){
if (length(dim(x)) == 2){
    y = x[,2]
    x = x[,1]
} else {
       y = x
       x = 1:length(y)
     } 
}

   if ( is.null(new) ){
   #determine whether to make a new plot or not
   new = FALSE
   if (is.null(recordPlot()[[1]])) new = TRUE
   }
   if (missing(xlim)) xlim = range(x)
   if (missing(ylim)) ylim = range(y)

   if (new){
   plot(x, y, type = type, xlim = xlim, ylim = ylim, ...)
   } else {
    if (type == "p"){
        points(x,y, ...)
    } else {
        lines(x,y, type = type, ...)
    }
    if (zoom){
    #rescale plot
    xcur = par("usr")[1:2]
    ycur = par("usr")[3:4]
    #shrink coordinates and pick biggest
    xcur = (xcur - mean(xcur)) /1.08 + mean(xcur)
    ycur = (ycur - mean(ycur)) /1.08 + mean(ycur)
    xlim = c(min(xlim[1], xcur[1]), max(xlim[2], xcur[2]))
    ylim = c(min(ylim[1], ycur[1]), max(ylim[2], ycur[2]))
    #zoom plot
    zoomplot(xlim, ylim)
    }
   }
 }

所以你可以这样做,例如

dev.new()
fplot(1:4)
fplot(1:4 +1, col = 2)
fplot(0:400/100 + 1, sin(0:400/10), type = "p")
dev.new()
for (k in 1:20) fplot(sort(rnorm(20)), type = "b", new = (k==1) )

par(mfrow) 和 log 轴目前不适用于缩放,但是,这是一个开始......

于 2012-10-23T10:15:55.823 回答