r - ggplot2 时间序列图,带有颜色编码的风向箭头

标签 r plot ggplot2 time-series rgraph

下午好,

我正在尝试生成一个时间序列图,箭头显示风向,颜色显示风速强度。最终,我试图得到一个这样的情节(只是我在网上找到的一个示例图片):

enter image description here

我设法找到了一个类似的帖子(见下文),我试图遵循,但我坚持正确显示风向箭头。

以前的类似帖子:
ggplot2 wind time series with arrows/vectors

到目前为止,我整理的代码如下:

require(ggplot2)
require(scales)
require(gridExtra)
require(lubridate)

dat <- data.frame(datetime = ISOdatetime(2013,08,04,0,0,0) +
                     seq(0:23)*60*60, pollutant = runif(24, 25, 75))

## create wind speed data
dat$ws <- runif(nrow(dat), 0 , 15 )

## create wind direction data
dat$wd <- runif(nrow(dat), 0 , 360 )

# define an end point for geom_segment
dat$x.end <- dat$datetime + minutes(60)

ggplot(data = dat, aes(x = datetime, y = pollutant)) +
  geom_line() +
  geom_segment(data = dat,
               size = 1,
               aes(x = datetime,
                   xend = x.end,
                   y = pollutant,
                   yend = wd),
               arrow = arrow(length = unit(0.5, "cm"))) +
  theme()

使用上面的代码,我得到以下图:
enter image description here

如您所见,该图从我希望它开始的箭头开始,但方向和终点太长,我不确定如何将其缩放为较短的箭头,颜色编码为速度。我真的很感激您对我如何实现这一目标的任何指导。

非常感谢,
阿燕

最佳答案

您上面显示的图没有给出正确的方向——例如dat$wd[1]大约是 190° ,因此如果 0° 对应于向右的水平箭头,则 190° 应该会给您一个指向左侧并稍微向下的箭头。

要获得方向正确的箭头,您需要将风向的余弦和正弦添加到箭头的起点以定义其端点(请参见下面的代码)。这里的难题是箭头在 x 和 y 方向上的缩放,因为 (1) 这些轴在完全不同的比例上,所以箭头的“长度”实际上并不意味着什么,以及 (2) 纵横比绘图设备会扭曲箭头的视觉长度。

我在下面发布了一个解决方案草图,其中我将 x 和 y 方向上箭头的偏移量缩放了用于绘图的变量范围的 10%,但这不会产生均匀视觉长度的向量。在任何情况下,这些箭头的长度都没有明确定义,因为 (a) x 轴和 y 轴代表不同的单位,(b) 改变绘图的纵横比将改变这些箭头的长度。

## arrows go from  (datetime, pollutant) to
##                 (datetime, pollutant) + scaling*(sin(wd), cos(wd))
scaling <- c(as.numeric(diff(range(dat$datetime)))*60*60, # convert to seconds 
                    diff(range(dat$pollutant)))/10
dat <- within(dat, {
    x.end <- datetime  + scaling[1] * cos(wd / 180 * pi)
    y.end <- pollutant + scaling[2] * sin(wd / 180 * pi)
})


ggplot(data = dat, aes(x = datetime, y = pollutant)) +
    geom_line() +
    geom_segment(data = dat,
                 size = 1,
                 aes(x = datetime,
                     xend = x.end,
                     y = pollutant,
                     yend = y.end,
                     colour=ws),
                 arrow = arrow(length = unit(0.1, "cm"))) +
scale_colour_gradient(low="green", high="red") 



改变纵横比会把事情搞砸:

关于r - ggplot2 时间序列图,带有颜色编码的风向箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912025/

相关文章:

r - 如何使用 R 在数据框的列中查找前 n% 的记录

r - 是否可以在没有 kableExtra 的情况下使用 kable 更改列宽?

r - 替代 R 中的 `str()`

r - 当数据位于不规则网格上时,如何使用 ggplot2 在 map 上绘制等高线?

r - 保存 r 脚本的输出,包括其命令

python - Matplotlib 在给定 csv 数据的情况下创建曲面图 (x,y,z,color) - 颜色错误

python - python中两个不同数据帧的散点图数据

Python 3D 堆积条形图

r - 与密度曲线叠加直方图

r - 更改圆环图中标签的位置