【问题标题】:Mapping bearing and speed of ocean currents绘制洋流的方位和速度
【发布时间】:2017-12-11 11:57:55
【问题描述】:

我有两个洋流方位和速度数据矩阵

bearings <- matrix(data = c(170.0833, 175.6863, 182.3538, 180.3335, 170.8965, 
                            178.3276, 182.3693, 187.2196, 182.3533, 168.3498, 
                            189.1664, 187.6813, 187.0393, 180.2259, 166.8412, 
                            193.4223, 188.5367, 182.4128, 175.2626, 167.3058, 
                            192.2930, 185.5073, 175.0302, 168.6284, 167.8392),
                   ncol = 5, nrow = 5, byrow = F)

speed <- matrix(data = c(0.1389173, 0.1585099, 0.1796583, 0.2021887, 0.2117295,
                         0.1196745, 0.1463118, 0.1637266, 0.1730471, 0.1804999, 
                         0.1309982, 0.1546123, 0.1593298, 0.1517513, 0.1550037, 
                         0.1621728, 0.1694083, 0.1606560, 0.1459710, 0.1457233,
                         0.1659898, 0.1535861, 0.1396885, 0.1294339, 0.1337756),
                 ncol = 5, nrow = 5, byrow = F)

我想用箭头绘制电流轴承的方向,而电流的大小/速度由箭头的长度表示,有点像这些地图:

风应力图取自 Shankar 等人。 2002

我知道包 oce 可能能够做类似的事情,但它专门用于不同类型的海洋数据,而不是我正在使用的矩阵/数据框。

有人碰巧知道怎么做吗?我已经使用raster() 库中的raster() 函数将它们制作成光栅对象:

library(raster)
bearing.rst <- raster(bearings,
                      xmn = 66,
                      xmx = 67.3333,
                      ymn = 10.6667,
                      ymx = 12)
speed.rst <- raster(speed,
                    xmn = 66,
                    xmx = 67.3333,
                    ymn = 10.6667,
                    ymx = 12)

理想情况下,我会使用基本 R 图形,或者使用与基本 R 图形配合得很好的软件包(例如,不是 ggplot2lattice)。

图表来自:

Shankar, D., Vinayachandra, P.N. 和 Unnikrishnan, A.S. (2002 年)。北印度洋的季风流。 海洋学进展,52: 62-120。 doi:10.1016/S0079-6611(02)00024-1

【问题讨论】:

  • geom_segment 可以使用 ggplot2 做到这一点。 ggplot2.tidyverse.org/reference/geom_segment.html
  • @RomanLuštrik 我发现了这一点,但我不确定如何将speed 矩阵放入其中,就像他们对delta_longdelta_lat 所做的那样。另外,基本 R 图形中有什么可以做到这一点的吗?

标签: r r-raster


【解决方案1】:

以 R 为基数:

plot(bearing.rst)  # your base map, I use this because I didn't have it

获取您的起始坐标:

arr.coor <- rasterToPoints(bearing.rst)
arr.coor <- cbind(arr.coor[,-3], bearing=c(t(bearings)), speed=c(t(speed)))

用三角函数计算你的完成坐标:

x1 <- arr.coor[,1] + arr.coor[,4] * cos(arr.coor[,3]*pi/180)
y1 <- arr.coor[,2] + arr.coor[,4] * sin(arr.coor[,3]*pi/180)
arr.coor <- cbind(arr.coor, x1, y1)

画出你的箭头:

arrows(arr.coor[,1],arr.coor[,2],arr.coor[,5],arr.coor[,6])

我猜同样的原则可以与 ggplot2 一起使用。我们的想法是获得一个包含所有箭头起点和终点的表格。

【讨论】:

    【解决方案2】:

    ggplot

    bearings <- c(170.0833, 175.6863, 182.3538, 180.3335, 170.8965, 
                                178.3276, 182.3693, 187.2196, 182.3533, 168.3498, 
                                189.1664, 187.6813, 187.0393, 180.2259, 166.8412, 
                                193.4223, 188.5367, 182.4128, 175.2626, 167.3058, 
                                192.2930, 185.5073, 175.0302, 168.6284, 167.8392)
    
    
    speed <- c(0.1389173, 0.1585099, 0.1796583, 0.2021887, 0.2117295,
                             0.1196745, 0.1463118, 0.1637266, 0.1730471, 0.1804999, 
                             0.1309982, 0.1546123, 0.1593298, 0.1517513, 0.1550037, 
                             0.1621728, 0.1694083, 0.1606560, 0.1459710, 0.1457233,
                             0.1659898, 0.1535861, 0.1396885, 0.1294339, 0.1337756)
    
    
    
    df <- data.frame(x = rep(1:5,5), 
                     y = rep(1:5, each = 5),
                     bearings = bearings,
                     speed = speed)
    
    df$dx <- sin((df$bearings)/360*pi*2)*df$speed
    df$dy <- cos((df$bearings)/360*pi*2)*df$speed
    
    ggplot(df, aes(x, y)) +
      geom_segment(aes(xend = x + dx, yend = y + dy),
                   arrow = arrow(length = unit(0.1,"cm"))) +
      theme_bw()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2016-05-03
      相关资源
      最近更新 更多