例如 :
plot(1:10, 1:10)
grid(col="red")
是否可以将红色网格围绕 x 轴和 y 轴(原点 {0,0})的交点旋转任意角度?这个例子没有任何意义,但我想这样做。
无论如何,网格函数可能无法在基础 R 中做到这一点。它不是面向对象的绘图范例。我想你会接近abline
:
plot(1:10, 1:10,xlim=c(0,10), ylim=c(0,10))
sapply(seq(0,20,by=2), function(a) abline(a=a, b=-1,lty=3,col="red"))
sapply(seq(-10,10,by=2), function(a) abline(a,b=1,lty=3,col="red"))
这是坐标几何的一个小应用,可以旋转任意角度。
angle=pi/8; rot=tan(angle); backrot=tan(angle+pi/2)
sapply(seq(-10,10,by=2), function(inter) abline(a=inter,
b=rot,lty=3,col="red"))
sapply(seq(0,40,by=2), function(inter) abline(a=inter,
b=backrot, lty=3,col="red"))
当 angle = pi/2 时,这确实会发生故障,因此您可能需要在构建函数时检查这一点,在这种情况下只需使用grid
. 我发现的一个问题是让间距令人满意。如果一个人以相同的间隔在 y 轴和 x 轴上进行迭代,您将获得一组网格线的“压缩”。我认为这就是为什么该方法在高角度时失效的原因。
我在想一个更通用的解决方案可能是构建一组网格端点,这些端点跨越并延伸超出绘图区域至少 sqrt(2) 的因子,然后应用旋转矩阵。然后使用segments
or lines
。这是该实现:
plot(1:10, 1:10,xlim=c(0,10), ylim=c(0,10)); angle=pi/8; rot=tan(angle);backrot=tan(angle+pi/2)
x0y0 <- matrix( c(rep(-20,41), -20:20), 41)
x1y1 <- matrix( c(rep(20,41), -20:20), 41)
# The rot function will construct a rotation matrix
rot <- function(theta) matrix(c( cos( theta ) , sin( theta ) ,
-sin( theta ), cos( theta ) ), 2)
# Leave origianal set of point untouched but create rotated version
rotx0y0 <- x0y0%*%rot(pi/8)
rotx1y1 <- x1y1%*%rot(pi/8)
segments(rotx0y0[,1] ,rotx0y0[,2], rotx1y1[,1], rotx1y1[,2], col="blue")
# Use originals again, ... or could write to rotate the new points
rotx0y0 <- x0y0%*%rot(pi/8+pi/2)
rotx1y1 <- x1y1%*%rot(pi/8+pi/2)
segments(rotx0y0[,1] ,rotx0y0[,2], rotx1y1[,1], rotx1y1[,2], col="blue")