R:一个图中日期对象的两条折线图
R: two line graphs from date objects in one plot
在我的数据框中有两列,它们都是日期对象(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"))
我们先按照您指定的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")
这是一个简单的解决方案,使用颜色来区分日期
library(lubridate)
library(tidyverse)
df %>%
ggplot()+
geom_freqpoly(aes(week(Date1), col = "Date1"))+
geom_freqpoly(aes(week(Date2), col = "Date2"))
主题的另一个变体:
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 创建
这里是 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))
在我的数据框中有两列,它们都是日期对象(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"))
我们先按照您指定的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")
这是一个简单的解决方案,使用颜色来区分日期
library(lubridate)
library(tidyverse)
df %>%
ggplot()+
geom_freqpoly(aes(week(Date1), col = "Date1"))+
geom_freqpoly(aes(week(Date2), col = "Date2"))
主题的另一个变体:
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 创建这里是 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))