R:绘制垂直于等高线的箭头

R: Plot arrows perpendicular to contour lines

我有两个向量表示散点图中的 x 和 y 坐标,每个 (x,y) 坐标的第三个变量 (z) 表示从中绘制等高线的变量。示例数据如下:

df<-data.frame(x=runif(n=30,min=-6,max=6),
               y=runif(n=30,min=-6,max=10),
               z=seq(1,100,length.out=30))

我使用 R 包 akima 生成等值线图的 z 矩阵

library(akima)
M1 <- interp(x=df$x,y=df$y,z=df$z)
contour(x=M1$x,y=M1$y,z=M1$z)

我现在想绘制垂直于轮廓线的箭头,最好使用 R 包 pracma 中的函数 "quiver" 之类的东西,箭头的原点在每个 (x,y) 坐标处,箭头指向等高线的梯度方向。有办法吗?

到目前为止,我最好的想法是以某种方式提取轮廓线的 (x,y) 梯度,并将它们用作箭袋函数中的速度。

感谢您的帮助。

pracma 包有一个 gradient 函数,可以使用原始 M1$z 值为您完成此操作。例如,使用您的代码在 set.seed(123):

之后获取 M1
contour(x=M1$x,y=M1$y,z=M1$z, asp = 1) # asp = 1 needed so things look perpendicular

library(pracma)
g <- gradient(M1$z, M1$x, M1$y)

x <- outer(M1$x, M1$y, function(x, y) x)
y <- outer(M1$x, M1$y, function(x, y) y)

quiver(x, y, g$Y, g$X, scale = 0.02, col = "blue")

请注意,quiver 图中的梯度标签已被交换。也许我设置了 xy 值从包期望的方式转置。这是你得到的: