在R中绘制风倒钩

Bad*_*ger 2 plot r weather

这是一个问题,看看是否有人在他们的旅行中看到过这样的事情.我正在处理大量的天气数据,我想根据风倒钩绘制风.

我已经查看了包装,RadioSonde但它的plotwind()功能并没有完成我预期的工作.它确实有一个很好的数据类型的例子data(ExampleSonde)

可以说我可以TeachingDemos结合my.symbols()创造这些风倒钩.如果有人发现(或创造)一种绘制风倒钩的方法,我只是好奇.否则my.symbols()就是.

谢谢,

use*_*650 5

另一种方法是使用grid图形创建风倒钩.

第一步是计算需要多少,以及需要什么类型的倒钩.如所描述的在这里,我创建三种类型,即表示50,10,和5节- I的速度向下舍入为最接近的五.

下面的函数wind_barb为每个给定的风速生成一个新的grob.使用集成网格图形输出和基本图形输出的想法- Murrell(第4页),您可以轻松绘制凹陷并通过旋转视口来表示风向.

一个例子

创建一些数据

set.seed(1)
dat <- data.frame(x=-2:2, y=-2:2, 
                  direction=sample(0:360, 5), 
                  speed=c(10, 15, 50, 75, 100))
#    x  y direction speed
# 1 -2 -2        95    10
# 2 -1 -1       133    15
# 3  0  0       205    50
# 4  1  1       325    75
# 5  2  2        72   100
Run Code Online (Sandbox Code Playgroud)

情节

library(gridBase)
library(grid)

with(dat, plot(x, y, ylim=c(-3, 3), xlim=c(-3, 3), pch=16))

vps <- baseViewports()
pushViewport(vps$inner, vps$figure, vps$plot)
# Plot
for (i in 1:nrow(dat)) {
    pushViewport(viewport(
                    x=unit(dat$x[i], "native"),
                    y=unit(dat$y[i], "native"), 
                    angle=dat$direction[i]))
        wind_barb(dat$speed[i])
    popViewport()
  }

popViewport(3)
Run Code Online (Sandbox Code Playgroud)

哪个产生

在此输入图像描述

wind_barb创建倒钩的功能(请简化我!).您可以分别通过调整mlengthwblength参数来更改倒钩的高度和宽度.

wind_barb <- function(x, mlength=0.1, wblength=0.025) {

  # Calculate which / how many barbs
    # any triangles (50)
    fif <- floor(x /50)
    # and then look for longer lines for remaining speed (10)
    tn <- floor( (x - fif* 50)/10)
    # and then look for shorter lines for remaining speed (5)
    fv <- floor( (x - fif* 50 - tn* 10)/5)

    # Spacing & barb length
    yadj <- 0.5+mlength
    dist <- (yadj-0.5) / 10    
    xadj <- 0.5+wblength
    xfadj <- 0.5+wblength/2        

  # Create grobs
    main_grob <- linesGrob(0.5, c(0.5, yadj ))

    # 50 windspeed
    if(fif != 0) {
      fify <- c(yadj, yadj-dist*seq_len(2* fif) )
      fifx <- c(0.5, xadj)[rep(1:2, length=length(fify))]
      fif_grob <- pathGrob(fifx, fify, gp=gpar(fill="black"))
    } else {
      fif_grob <- NULL
      fify <- yadj+dist
    }

    # Ten windspeed
    if(tn != 0) {
    tny <- lapply(seq_len(tn) , function(x) min(fify) - dist*c(x, x-1))  
    tn_grob <- do.call(gList, 
                      mapply(function(x,y) 
                             linesGrob(x=x, y=y, gp=gpar(fill="black")),
                                      x=list(c(0.5, xadj)), y=tny, SIMPLIFY=FALSE))
    } else {
      tn_grob <- NULL
      tny <- fify
    }

    # Five windspeed
    if(fv != 0) {
    fvy <- lapply(seq_len(fv) , function(x) min(unlist(tny)) -dist* c(x, x-0.5))
    fv_grob <- do.call(gList, 
                        mapply(function(x,y) 
                              linesGrob(x=x, y=y, gp=gpar(fill="black")),
                                      x=list(c(0.5, xfadj)), y=fvy, SIMPLIFY=FALSE))
    } else {
      fv_grob <- NULL
    }    

    # Draw    
    #grid.newpage()
    grid.draw(gList(main_grob, fif_grob, tn_grob, fv_grob))
}
Run Code Online (Sandbox Code Playgroud)

-------------------------------------

来自下面的评论

绘制的风向是错误的.要有正确的气象风向,请使用angle = 360 - dat$direction[i].请参阅http://tornado.sfsu.edu/geosciences/classes/m430/Wind/WindDirection.html