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

Ach*_*hak 6 plot r time-series ggplot2 rgraph

下午好,

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

在此输入图像描述

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

一篇类似的帖子: ggplot2带箭头/向量的风时间序列

我到目前为止所编的代码如下:

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()
Run Code Online (Sandbox Code Playgroud)

使用上面的代码我得到以下图: 在此输入图像描述

你可以看到情节开始我希望它开始的箭头,但方向和终点太长,我不知道如何将其缩放为一个颜色编码为速度的较短箭头.我非常感谢您对我如何实现这一目标的任何指导.

非常感谢,阿燕

fab*_*ans 4

上面显示的图没有给出正确的方向 - 例如dat$wd[1]大约 190\xc2\xb0 ,所以如果 0\xc2\xb0 对应于向右的水平箭头, 190\xc2\xb0 应该给你一个指向左侧的箭头并略有下降。

\n\n

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

\n\n

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

\n\n
## arrows go from  (datetime, pollutant) to\n##                 (datetime, pollutant) + scaling*(sin(wd), cos(wd))\nscaling <- c(as.numeric(diff(range(dat$datetime)))*60*60, # convert to seconds \n                    diff(range(dat$pollutant)))/10\ndat <- within(dat, {\n    x.end <- datetime  + scaling[1] * cos(wd / 180 * pi)\n    y.end <- pollutant + scaling[2] * sin(wd / 180 * pi)\n})\n\n\nggplot(data = dat, aes(x = datetime, y = pollutant)) +\n    geom_line() +\n    geom_segment(data = dat,\n                 size = 1,\n                 aes(x = datetime,\n                     xend = x.end,\n                     y = pollutant,\n                     yend = y.end,\n                     colour=ws),\n                 arrow = arrow(length = unit(0.1, "cm"))) +\nscale_colour_gradient(low="green", high="red") \n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n

改变纵横比会让事情变得混乱:\n

\n