关于R最令我烦恼的事情之一是绘图,点和线命令的分离。对于第一个完成的绘图,必须将绘图更改为任何变体,并且如果您最初未能将ylim和xlim设置为正确,则必须从头开始重新绘制,这有点令人恼火。拥有一个命令是不是很好:
通过参数挑选行,点或两者,如plot(..., type = "l")
?
默认情况下,根据当前设备是否为空来选择是创建新图还是添加到现有图。
如果绘图中添加的元素超出当前范围,则会自动重新调整轴。
有人做过这样的事吗?如果没有,并且没有充分的理由说明为什么这是不可能的,我会自己回答一下......
答案 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轴目前在缩放时效果不佳,但是,这是一个开始......