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
图中的梯度标签已被交换。也许我设置了 x
和 y
值从包期望的方式转置。这是你得到的:
我有两个向量表示散点图中的 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
图中的梯度标签已被交换。也许我设置了 x
和 y
值从包期望的方式转置。这是你得到的: