【问题标题】:How to represent the timeline of events (date-times) in R如何在 R 中表示事件的时间线(日期时间)
【发布时间】:2017-11-07 11:10:00
【问题描述】:

我有一个带有日期时间列的 data.frame,例如

 D = data.frame(time = c("2007-06-22","2007-05-22","2007-05-23"))
 D$time <- strptime(D$time, format = "%m/%d/%Y")
 class(D$time)
"POSIXlt" "POSIXt" 

我想在 x 轴上创建一个带有附加中性时间线的图,例如,对于 2007 年,刻度/单位应该是月。所以只是日期的“直方图”。

我试过hist(D$time, breaks = "days"),但它只是返回错误。

否则,可以按公制尺度为每个日期绘制给定时间间隔(例如 2007 年)的日期。所以像“geom_jitter”这样的东西。

我尝试了ggplot(D$time),但它无法处理 POSIXlt/POSIXt 类。

我正在寻找一种简单直接的方法来在给定的时间间隔内绘制我的时间事件。非常感谢。

【问题讨论】:

  • 你能发布确切的结果吗?

标签: r datetime ggplot2


【解决方案1】:

您可以使用ggplot2scales 来实现:

library(gglot2)
library(scales)

首先创建一个带有data = Dtime 的ggplot 作为你的x 审美。添加geom_bar()(即条形图)并更改 x 轴以仅显示月份并设置特定限制(在本例中为 2007 年的第一天和最后一天):

ggplot(data = D, aes(x = time)) + geom_bar() + 
  scale_x_date(labels = date_format("%b"),
               limits = c(as.Date('2007-01-01'), as.Date('2007-12-31')))

返回:

如果您想显示每月的事件,您可以使用lubridatedplyrggplot2

library(dplyr)
library(lubridate)
library(ggplot2)

D = data.frame(time = c("2007-06-22","2007-05-22","2007-05-23"))

在这种情况下,您会得到日期的缩写月份:

D2 <- D
D2$month <- month(D$time, label = TRUE)

您可以按月分组并统计事件数:

D2 <- D2 %>% 
  group_by(month) %>%
  summarise(n = n())

使用n = 0 将缺少的月份(如果有)添加到您的数据框中:

D2 <- rbind(D2, 
            data.frame(month = levels(D2$month)[!(levels(D2$month) %in% D2$month)],
                       n = 0))

绘制新数据(注意:在geom_bar() 中使用stat = 'identity',因为您在y 美学中明确传递了计数:):

ggplot(data = D2, aes(x = month, y = n)) + 
  geom_bar(stat = 'identity')

返回:

选项编号 3:

使用多年的更灵活的方法:

D = data.frame(time = c("2006-05-16", "2007-06-22","2007-05-22","2007-05-23")) 

(注:添加不同年份的一个日期)

创建一个额外的year 列:

D3 <- D
D3$month <- month(D$time, label = TRUE)
D3$year <- year(D$time)

monthyear 分组:

D3 <- D3 %>% 
  group_by(year, month) %>%
  summarise(n = n())

找出每年缺失的月份:

missing <- do.call("rbind", 
                   lapply(unique(D3$year), function(y) {
                     data.frame(year = y,
                                month = levels(D3[D3$year == y, ]$month)[!(levels(D3[D3$year == y, ]$month) %in% D3[D3$year == y, ]$month)],
                                n = 0)


                   }))      

结合D3missing

all <- rbind(as.data.frame(D3), missing)

创建新的可视化:

ggplot(data = all, aes(x = month, y = n, group = factor(year), fill = factor(year))) + 
  geom_bar(position = "dodge", stat = 'identity')

看起来像这样:

【讨论】:

  • 好的,我喜欢这个结果,但它是一个小变通方法,而且我在其他设计版本上没有那么灵活。如果我得到新的年份并想按年份绘制它,我总是必须先定义新的列,对吗?有没有办法直接处理单变量时间情况?问候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2020-04-22
  • 2020-09-22
  • 2021-11-27
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多