【问题标题】:ggplot2 segment -- direction when x-axis is timeggplot2 段 -- x 轴为时间时的方向
【发布时间】:2016-02-21 22:29:10
【问题描述】:

我有一个风速和风向时间序列,我正在尝试制作一个使用线段来描绘风速和风向的图。我需要有一个风速与时间的基本点散点图(我可以创建),每个点都有一条线段(这是我挂断的地方)。线的长度必须与风速成正比,并且角度需要根据风向。我将 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 的正确公式。

    任何建议将不胜感激。

    谢谢!!!

    【问题讨论】:

    • 您能否提供您的数据样本供我们使用?只需将dput(Gustav) 的输出粘贴到您的问题中即可。您不需要粘贴整个内容。 10 或 20 行(例如,dput(Gustav[1:20,]))就足够了。
    • 您的角度似乎被拉伸了,因此这些线段指向上方或下方。我的猜测是,这是因为 x 轴上的单位与 y 轴上的单位不同。是否有一些因素将 x 轴和 y 轴上的单位与图中的单位相关联?也许你可以使用不同的因子而不是 18000。
    • 这不是单位本身的不同,而是 x 值的范围与 y 值的范围不同。在这种情况下,x 值以秒为单位,x 轴跨越约 864000 秒(10 天),而 y 轴以 mph 为单位,跨越约 50 mph。 864000/50 = 17280,接近 OP 提出的 18000 比例因子。但是,例如,如果我们将 x 轴的长度设置为仅 50 秒(这在此处没有用处),则方向线将被正确缩放。
    • 要正确缩放方向线,请将DelX 乘以 x 轴范围与 y 轴范围的比率。为了得到这个精确,您应该使用coord_cartesian 设置 x 和 y 轴范围,然后将它们的范围之比作为比例因子。

    标签: r ggplot2 time-series lubridate


    【解决方案1】:

    使用@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)
    

    【讨论】:

    • 我突然想到,在进行缩放时还需要考虑图形的纵横比。您和我描述的方法仅适用于coord_fixed(ratio=1)(意味着 x 和 y 方向上的一个单位在图上每个跨越相同的物理距离),当 x 和 y 值跨越非常不同的范围时,这不是很有用。您可以看到,如果您创建几个不同的 dir 值而不是仅仅 45 度,它通常不起作用。
    • 幸好这不是问题,因为风只从东北吹来,对吧?
    • 多么巧合,这正是我今天正在研究的内容。但是如果 x 和 y 轴对应经度和纬度呢?我想弄清楚怎么做,但我就是做错了。
    • 哈哈哈......飓风期间不在路易斯安那......谢谢@eipi10和Tedward。我认为这解释了我需要的一切!!!
    【解决方案2】:

    如果您愿意替代geom_segment(),则可以使用geom_text() 和ANSI(unicode)箭头符号 来获得所需的输出:

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

    【讨论】:

    • 我认为这可能是一种真正的替代方式,但很可能是最简单和最好的。很适合我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多