在 R 中绘制 Wind Barb
Plot Wind Barb in R
这更像是一个问题,看看有没有人在他们的旅行中看到过这样的事情。我正在处理大量天气数据,我想根据 wind barbs 绘制风。
我查看了包 RadioSonde
,但是它的 plotwind()
功能没有达到我预期的效果。它确实有一个很好的数据类型示例 data(ExampleSonde)
可以说我可以结合使用 TeachingDemos
和 my.symbols()
来创建这些风刺。我只是好奇是否有人找到(或创造)了一种绘制风刺的方法。否则my.symbols()
是。
谢谢,
獾
另一种方法是使用 grid
图形创建风刺。
第一步是计算需要多少倒钩以及需要哪种类型的倒钩。如所述 here,我创建了三种类型,分别代表 50、10 和 5 节 - 我将速度四舍五入到最接近的五。
下面的函数 wind_barb
为给定的每个风速生成一个新的 grob。使用来自 Integrating Grid Graphics Output with Base Graphics Output - Murrell (pg4) 的想法,您可以轻松绘制 grobs 并通过旋转视口来表示风向。
一个例子
创建一些数据
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
情节
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)
产生
wind_barb
函数创建倒钩(请简化我!)。您可以通过分别调整 mlength
和 wblength
参数来更改倒钩的高度和宽度。
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))
}
------------------------------------
来自以下 sezen 的评论
The plotted wind direction is wrong. To have right meteorological wind direction, use angle = 360 - dat$direction[i]
. See http://tornado.sfsu.edu/geosciences/classes/m430/Wind/WindDirection.html
这更像是一个问题,看看有没有人在他们的旅行中看到过这样的事情。我正在处理大量天气数据,我想根据 wind barbs 绘制风。
我查看了包 RadioSonde
,但是它的 plotwind()
功能没有达到我预期的效果。它确实有一个很好的数据类型示例 data(ExampleSonde)
可以说我可以结合使用 TeachingDemos
和 my.symbols()
来创建这些风刺。我只是好奇是否有人找到(或创造)了一种绘制风刺的方法。否则my.symbols()
是。
谢谢,
獾
另一种方法是使用 grid
图形创建风刺。
第一步是计算需要多少倒钩以及需要哪种类型的倒钩。如所述 here,我创建了三种类型,分别代表 50、10 和 5 节 - 我将速度四舍五入到最接近的五。
下面的函数 wind_barb
为给定的每个风速生成一个新的 grob。使用来自 Integrating Grid Graphics Output with Base Graphics Output - Murrell (pg4) 的想法,您可以轻松绘制 grobs 并通过旋转视口来表示风向。
一个例子
创建一些数据
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
情节
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)
产生
wind_barb
函数创建倒钩(请简化我!)。您可以通过分别调整 mlength
和 wblength
参数来更改倒钩的高度和宽度。
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))
}
------------------------------------
来自以下 sezen 的评论
The plotted wind direction is wrong. To have right meteorological wind direction, use
angle = 360 - dat$direction[i]
. See http://tornado.sfsu.edu/geosciences/classes/m430/Wind/WindDirection.html