【问题标题】:R: Plot arrows perpendicular to contour linesR:绘制垂直于等高线的箭头
【发布时间】:2018-10-23 11:53:14
【问题描述】:

我有两个向量表示散点图中的 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)-梯度,并将其用作 quiver 函数中的速度。

感谢您的帮助。

【问题讨论】:

  • 您能否澄清一下:您希望将箭头附加到等高线上,还是在每个(M1$x, M1$y) 对上?
  • 好点。我希望每个 (M1$x,M1$y) 对都附上箭头
  • 您可以使用栅格包“terrain”函数和“aspect”选项来获取高程栅格上某个点的角度。例如plot(terrain(raster(M1),"aspect")) - 然后在点处对栅格进行采样,用正弦和余弦绘制箭头...
  • @Spacedman 谢谢你的建议,我试试看

标签: r gradient contour arrows


【解决方案1】:

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 值,这些值是从包的预期方式转换而来的。这是你得到的:

【讨论】:

  • 后续问题:您知道将箭头附加到原始 (x,y) 坐标的方法吗? (df$x,df$y)
  • 您也许可以使用pracma::interp2 将梯度值插入到这些点,但是在刚才的快速尝试中,我发现它在数据集凸包上的任何点上都失败了。 30分,就是一半的分。
  • 好的会尝试使用interp2,感谢您的努力
猜你喜欢
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
相关资源
最近更新 更多