用颜色编码的风向箭头绘制ggplot2时间序列图
下午好,
我正在尝试制作一个带有箭头的时间序列图,显示风向并着色显示风速强度。 最终,我试图得到一个这样的情节(只是我在网上找到的一个示例图片):
我设法找到了一个类似的帖子(见下文),我试图跟随,但我坚持正确显示风向箭头。
上一个类似的帖子: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()
使用上面的代码,我得到以下图:
正如你所看到的情节开始的箭头,我希望它开始,但方向和终点太长,我不知道我怎么可以缩放这是一个较短的箭头与颜色编码的速度。 我非常感谢你对我如何实现这一目标的任何指导。
非常感谢,阿燕
上面显示的图不会给出正确的方向 - 例如, dat$wd[1]
约为190°,所以如果0°对应右侧的水平箭头,则190°应该会给您一个向左且稍微向下的箭头。
为了使箭头朝向正确的方向,需要将风向的余弦和正弦增加到箭头的起点以定义其终点(请参阅下面的代码)。 因为(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")
并改变纵横比类似的东西:
这并不完整,但我希望这将成为您或其他人的开始。 我是否正确理解以下内容?
如果是这样,一个缺少的部分是从极坐标转换到笛卡尔坐标。 (例如,http://www.engineeringtoolbox.com/converting-cartesian-polar-coordinates-d_1347.html)
坐标系是我没有想到的缺失部分。 该图是两个坐标系的混合。 箭头的起点基于(时间x污染物)。 但矢量是方向和风速的极坐标。 假设(时间x污染物)的纵横比不为1,则来自北部的5节小风将具有与来自东南部的5节小风不同的长度。
有两件事情需要调整。 一个是(时间×污染物)纵横比。 另一个是图形的物理尺寸。 我不知道如何处理第二个问题,所以我将其固定为一个恒定值。 但想象一下你会想要一些更好的方法 - 可能是通过查询一些底层网格属性。
dat <- data.frame(
datetime = 0:100,
#datetime = ISOdatetime(2013,08,04,0,0,0) + seq(0:23)*60*60,
pollutant = 0 #Swap the next two lines for a nonuniform pollutant
#pollutant = runif(24, 25, 75)
)
## convert to a numeric variable
# dat$datetime <- 0
# dat$datetime <- as.numeric(dat$datetime)
#Adjust the aspect ratio
# xrange <- range(dat$datetime)
xlimits <- c(-5, 100)
xrange <- diff(range(xlimits))
ylimits <- c(-5, 10)
yrange <- diff(range(ylimits))
aspectratio <- xrange/yrange
## create wind speed data
dat$ws <- 1
# dat$ws <- runif(nrow(dat), 0, 15)
## create wind direction data
#dat$wd_degrees <- runif(nrow(dat), 0, 360)
dat$wd_degrees <- seq(from=0, to=360, length.out=nrow(dat))
dat$wd_radians <- dat$wd_degrees * (pi/180)
## convert from polar to cartesian
dat$xend <- aspectratio * (dat$ws * sin(dat$wd_radians)) + dat$datetime
dat$yend <- aspectratio * (dat$ws * cos(dat$wd_radians)) + dat$pollutant
ggplot(data = dat, aes(x = datetime, y = pollutant)) +
geom_line() +
geom_segment(data = dat,
size = 1,
aes(xend = xend,
yend = yend,
color = ws),
arrow = arrow(length = unit(0.5, "cm"))) +
coord_fixed(xlim=xlimits, ylim=ylimits, ratio=1) +
theme()
使用十进制度计算风向。 假设你想0度为北(上),使用以下内容:
ggplot(data = dat, aes(x=datetime, y=pollutant)) +
geom_text(aes(angle=-wd_degrees+90), label="→")
链接地址: http://www.djcxy.com/p/86149.html
上一篇: ggplot2 time series plot with colour coded wind direction arrows
下一篇: R: Scatter plot of time series data for multiple points, ggplot?, reshape?