【问题标题】:R: two line graphs from date objects in one plotR:一张图中日期对象的两个折线图
【发布时间】:2021-10-31 03:58:19
【问题描述】:

在我的数据框中,我有两列,它们都是日期对象(Date1,Date2)。我想为两个日期对象画一条线并将它们放在同一个图中,但找不到方法。我应该使用pivot_longer吗?

只有一个变量的情节

df %>%
  mutate(week = week(Date1)) %>%
  ggplot(aes(week)) +
  geom_freqpoly()

数据

structure(list(Date1 = structure(c(1583712000, 1583712000, 1583712000, 
1584144000, 1584316800, 1584489600, 1585094400, 1585267200, 1585267200, 
1588550400, 1589414400, 1591228800, 1592179200, 1597104000, 1597363200, 
1597881600, 1605052800, 1605484800, 1614902400, 1580256000, 1582502400, 
1582761600, 1582848000, 1583107200, 1583107200, 1583712000, 1583712000, 
1583884800, 1583884800, 1584316800, 1584316800, 1584316800, 1584316800, 
1584316800, 1584316800, 1584316800, 1584489600, 1584921600, 1585180800, 
1585267200, 1587513600, 1591228800, 1602460800, 1604016000, 1613779200, 
1613779200, 1614038400, 1615852800, 1615852800, 1615852800, 1623024000, 
1624233600, 1629244800, 1630281600, 1582588800, 1582848000, 1582848000, 
1583193600, 1583193600, 1583193600, 1583280000, 1583712000, 1583712000, 
1583712000, 1583884800, 1583884800, 1583971200, 1583884800, 1615593600, 
1615939200, 1584489600, 1584662400, 1584662400, 1584662400, 1584921600, 
1585094400, 1585180800, 1585180800, 1585526400, 1585785600, 1586304000, 
1587600000, 1586131200, 1586131200, 1586217600, 1586908800, 1587340800, 
1587340800, 1587340800, 1587340800, 1587513600, 1587600000, 1587945600, 
1588032000, 1588723200, 1589155200, 1589241600, 1589414400, 1589760000, 
1589760000, 1589932800, 1590969600, 1596240000, 1596240000, 1598832000, 
1601510400, 1601596800, 1602720000, 1602547200, 1602547200, 1602547200, 
1603152000, 1604620800, 1604620800, 1605225600, 1605225600, 1606435200, 
1606435200, 1607644800, 1607644800, 1578355200, 1610323200, 1607904000, 
1610582400, 1611532800, 1580169600, 1613692800, 1613692800, 1583280000, 
1583366400, 1615334400, 1616716800, 1618358400, 1618790400, 1619049600, 
1619568000, 1619395200, 1622073600, 1623024000, 1612915200, 1620777600
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Date2 = structure(c(1579824000, 
1579824000, 1581552000, 1582243200, 1583193600, 1583193600, 1583366400, 
1583366400, 1583366400, 1583452800, 1583971200, 1585526400, 1583971200, 
1583971200, 1584057600, 1584057600, 1584316800, 1584316800, 1584489600, 
1584576000, 1584576000, 1584662400, 1585267200, 1585267200, 1585526400, 
1585785600, 1585785600, 1585872000, 1586390400, 1586908800, 1587600000, 
1587945600, 1588032000, 1588032000, 1588636800, 1588809600, 1588809600, 
1589241600, 1589414400, 1591660800, 1592438400, 1596412800, 1596499200, 
1597190400, 1598486400, 1598572800, 1598572800, 1600300800, 1603411200, 
1604275200, 1606348800, 1606521600, 1606780800, 1607472000, 1611273600, 
1611705600, 1612224000, 1614211200, 1614556800, 1616025600, 1616025600, 
1618444800, 1618444800, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA), class = c("POSIXct", "POSIXt"), tzone = "UTC")), row.names = c(NA, 
-141L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

    标签: r ggplot2 tidyverse lubridate


    【解决方案1】:

    这是一个带有geom_line的版本:

    library(tidyverse)
    df %>% 
        mutate(across(everything(), ~week(.))) %>% 
        pivot_longer(everything(), 
                     names_to = "name",
                     values_to = "week") %>% 
        count(name, week) %>% 
        ggplot(aes(x= week, y=n, color=name, group=name)) +
        geom_line() +
        coord_cartesian(ylim = c(0, 20))
    

    【讨论】:

      【解决方案2】:

      我们首先使用lubridate::week按照您的指定提取完整的7天周期数,然后我们使用tidyr::pivotlonger将两个新创建的变量的名称存储在一个变量中,以便我们可以使用它来映射到colour审美为了区分线条:

      library(tidyr)
      library(lubridate)
      library(ggplot2)
      
      df %>%
        mutate(across(everything(), ~ week(.x), .names = "{.col}_Week")) %>% 
        pivot_longer(c(Date1_Week, Date2_Week), names_to = "Date", values_to = "Value") %>%
        ggplot(aes(Value, colour = Date)) +
        geom_freqpoly(size = 1, binwidth = 0.9) + 
        labs(x = "Week")
      

      【讨论】:

        【解决方案3】:

        主题的另一个变体:

        
        library(ggplot2)
        library(dplyr)
        library(tidyr)
        library(lubridate)
        
        df %>%
          pivot_longer(everything())%>% 
          mutate(week = week(value)) %>%
          ggplot(aes(week, colour = name)) +
          geom_freqpoly()
        
        

        由reprex package (v2.0.0) 于 2021-09-01 创建

        【讨论】:

          【解决方案4】:

          这是一个简单的解决方案,使用颜色来区分日期

          library(lubridate)
          library(tidyverse)
          
          df %>% 
            ggplot()+
            geom_freqpoly(aes(week(Date1), col = "Date1"))+
            geom_freqpoly(aes(week(Date2), col = "Date2"))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-25
            • 2017-11-01
            • 2017-02-28
            • 1970-01-01
            • 2023-03-30
            相关资源
            最近更新 更多