我有一个带有日期时间列的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年,刻度/单位应该是月。所以只是一个&#34;直方图&#34;日期。
我尝试了hist(D$time, breaks = "days")
,但它只是返回错误。
否则,可以按指标比例为每个单独的日期绘制给定时间间隔(例如2007年)的日期。所以像&#34; geom_jitter&#34;。
我尝试ggplot(D$time)
但它无法处理POSIXlt / POSIXt类。
我正在寻找一种简单直接的方法来在给定的时间间隔内绘制我的时间事件。非常感谢。
答案 0 :(得分:1)
您可以使用ggplot2
和scales
来实现此目标:
library(gglot2)
library(scales)
首先创建一个带有data = D
和time
的ggplot。添加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')))
返回:
如果您想每月展示一次活动,可以使用lubridate
和dplyr
以及ggplot2
:
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))
绘制新数据(注意:在stat = 'identity'
中使用geom_bar()
,因为您明确传递了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)
按month
和year
分组:
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)
}))
合并D3
和missing
:
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')
看起来像这样: