方便的包装,用于绘图,线条和点

时间:2012-10-23 09:20:00

标签: r plot convenience-methods

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

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

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

  3. 如果绘图中添加的元素超出当前范围,则会自动重新调整轴。

  4. 有人做过这样的事吗?如果没有,并且没有充分的理由说明为什么这是不可能的,我会自己回答一下......

2 个答案:

答案 0 :(得分:1)

一些可能有助于实现目标的功能:

matplot函数使用基本图形,并在一个步骤中绘制几组点或线,一步计算出正确的范围。

格子图形有update方法,可用于在图中添加/更改内容,因此会自动重新计算限制和轴等内容。

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

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

答案 1 :(得分:0)

无论如何,这就是我想出的:(它使用zoomplot中的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轴目前在缩放时效果不佳,但是,这是一个开始......