ggplot2 segment -- x 轴为时间时的方向

ggplot2 segment -- direction when x-axis is time

我有一个风速和风向时间序列,我正在尝试制作一个使用线段来描绘风速和风向的图。我需要有一个风速与时间(我可以创建)的基本点散点图,每个点都有一条线段(这是我挂断的地方。)线的长度必须与风速成正比并且角度需要风向。我将 ggplot2 与 geom_segment 一起使用,但因为 x 是时间,所以我无法找到用于 xend 的正确公式。

这是数据框的示例:

  • 日期时间 WINDSPEED_MPH DIR
  • 2008 年 8 月 29 日 0:00 4.28 231
  • 2008 年 8 月 29 日 1:00 3.11 236
  • 2008 年 8 月 29 日 2:00 1.36 237
  • 2008 年 8 月 29 日 3:00 2.92 153
  • 2008 年 8 月 29 日 4:00 1.94 314
  • 2008 年 8 月 29 日 5:00 3.11 293
  • 到目前为止,这是我的代码:

    library(ggplot2) 
    library(lubridate)
    
    Gustav <- read.csv("C:/Users/ezco3/My Research/LPBF/Pontchartrain-Maurepas Surge Consortium/Projects/Lake Tilting Effect Graphic/Datasets/Gustav_NewCanal_Hydro&Metero.csv")
    
    Gustav$TS <- as.POSIXct(Gustav$DateTime, "%m/%d/%Y %H:%M", tz="America/Chicago")
    Gustav$DelY <- Gustav$WINDSPEED_MPH*sin(Gustav$DIR)/max(Gustav$WINDSPEED_MPH, na.rm=TRUE)
    Gustav$DelX <- Gustav$WINDSPEED_MPH*cos(Gustav$DIR)/max(Gustav$WINDSPEED_MPH, na.rm=TRUE)
    
    plt1 <- ggplot(data = Gustav, aes(x = TS, y =WINDSPEED_MPH))
    plt1 + geom_point(color="blue") + 
      geom_segment(data = Gustav, mapping=aes(x= TS, y = WINDSPEED_MPH, xend = TS + 18000*DelX, 
                   yend=WINDSPEED_MPH + 5*DelY),size=.1,color="red")
    

    而且,这创造了这个:

    DelX前面的18000和DelY前面的5都是我通过试错找到的任意数。基本上,最初只使用 DelX 和 DelY(没有乘法器),线条又短又垂直,所以我尝试了不同的选项,直到找到这对显示线条方向的线。

    但是,角度不正确。在这个阶段,我不明白单位如何与 lubridate 中的时间序列对象一起工作,所以我不知道如何为 xend 计算正确的公式。

    如有任何建议,我们将不胜感激。

    谢谢!!!

    使用@eipi10的建议计算出合适的比例乘以x的变化但没有明确设置坐标限制,这是一个正确显示45度风向的解决方案,段的长度对应风速。

    date <- seq(ymd('2012-04-07'),ymd('2013-03-22'), by = 'day')
    windspeed <- rnorm(n = length(date), mean = 5, sd = 1)
    dir <- rep((c(0,30,45,60,90)*(pi/180)), times = length(date)/5)
    
    data <- data.frame(date, windspeed, dir)
    
    rat <-as.numeric(interval(min(date), max(date))) / (max(windspeed) - min(windspeed))
    
    data <- data %>%
        mutate(DelY = windspeed * sin(dir)/(2*max(windspeed)),
               DelX  = rat * windspeed * cos(dir)/(2*max(windspeed)))
    
    
    
    plt1 <- ggplot(data = data, aes(x = date, y =windspeed))
    plt1 + geom_point(color="blue")+
      geom_segment(aes(x= date, y = windspeed, xend = date + DelX,
                       yend=windspeed + DelY),size=.1,color="red") +
      coord_fixed(ratio = rat)
    

    如果您对 geom_segment() 的替代方案持开放态度,那么您可以使用 geom_text() 和 ANSI(unicode)箭头符号 来获得所需的输出:

    ggplot(data = data, aes(x=date, y=windspeed)) + 
      geom_point() + 
      geom_text(aes(angle=-dir+90), label="→")