问题陈述:
使用ggquiver::geom_quiver()
,我们可以绘制向量场,前提是我们知道x
,y
,xend
和yend
的值。
- 我如何为任意高程的
RasterLayer
计算这些参数? - 我如何确保这些箭头的大小显示该向量的坡度,以便箭头在该位置的梯度成比例地不同长度显示(例如下面的第一张图)?
背景:
# ggquiver example
library(tidyverse)
library(ggquiver)
expand.grid(x=seq(0,pi,pi/12), y=seq(0,pi,pi/12)) %>%
ggplot(aes(x=x,y=y,u=cos(x),v=sin(y))) +
geom_quiver()
另一种相关的方法使用rasterVis::vectorplot
,其依赖于raster::terrain
(假设字段单位== CRS单位)来计算和绘制矢量场。 源代码在这里。
library(raster)
library(rasterVis)
r <- getData('alt', country='FRA', mask=TRUE)
r <- aggregate(r, 20)
vectorplot(r, par.settings=RdBuTheme())
结论:
回顾一下,我想将一个任意的高程rasterLayer
转换为一个data.frame
,计算出高程矢量场的x
、y
、xmax
和ymax
组成部分,使箭头的大小表明在该点的相对斜率(如上面的图1和图2所示),并使用ggquiver
进行绘图。就像这样:
names(r) <- "z"
rd <- as.data.frame(r, xy=TRUE)
# calculate x, y, xend, yend for gradient vectors, add to rd, then plot
ggplot(rd) +
geom_raster(aes(x, y, fill = z)) +
geom_quiver(aes(x, y, xend, yend))