Plot time series with missing date ranges R
对我来说,可能微不足道但很难解决。
给定
1 2 3 4 5 6 7 8 9 | A= structure(list(start..yyyy.mm. = c(197901L, 197901L, 197901L, 197901L, 197901L), X.yyyy.mm. = c(197901L, 197904L, 197908L, 197902L, 197902L), duration = c(1L, 4L, 8L, 2L, 2L), area..km.2. = structure(c(1L, 2L, 4L, 3L, 5L), .Label = c("46952.85","c(125267.7, 72379.43, 72468.91, 13200.26)", "c(19814.74, 39570.96)","c(26513.05, 26513.05, 26513.05, 26513.05, 26513.05, 19898.57, 26513.05, 26513.05)", "c(52291.77, 52291.77)"), class ="factor")), .Names = c("start..yyyy.mm.", "X.yyyy.mm.","duration","area..km.2."), class ="data.frame", row.names = c(NA, -5L)) |
我想产生类似于下面所示的图(忽略直方图)。每个
如您所见,
不记录任何值的日期范围应为
如何使用任何程序包实现R?
想到的第一个想法是创建一个连续的日期,如下所示:
1 2 | library(dplyr) data_with_missing_times <- full_join(ts,A) |
然后做图?这里有一个类似的问题,但我打算在此处遮盖日期范围。我的数据来自
谢谢。
我不确定您要绘制的内容到底是什么,但这可以解决问题。奇怪的是,您将区域设置为因子形式而不是列表列,因为这会强制
编辑:如果您通过这种方法进行研究,它的工作就是避免在时间序列中为每个月创建行,而仅在存在要绘制区域的地方创建观察值。如果要扩展x轴的限制,可以简单地调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | library(tidyverse) A <- structure(list(start..yyyy.mm. = c(197901L, 197901L, 197901L,197901L, 197901L), X.yyyy.mm. = c(197901L, 197904L, 197908L,197902L, 197902L), duration = c(1L, 4L, 8L, 2L, 2L), area..km.2. = structure(c(1L,2L, 4L, 3L, 5L), .Label = c("46952.85","c(125267.7, 72379.43, 72468.91, 13200.26)","c(19814.74, 39570.96)","c(26513.05, 26513.05, 26513.05, 26513.05, 26513.05, 19898.57, 26513.05, 26513.05)","c(52291.77, 52291.77)"), class ="factor")), .Names = c("start..yyyy.mm.","X.yyyy.mm.","duration","area..km.2."), class ="data.frame", row.names = c(NA,-5L)) tbl <- A %>% mutate(start = seq.Date(as.Date("1979-01-01"), by ="year", length.out = 5)) %>% select(start, duration, area = area..km.2.) %>% rowid_to_column() %>% separate_rows(area) %>% filter(!area %in% c("c","")) indices <- seq(nrow(tbl)) %>% split(group_indices(tbl, rowid)) %>% map(~ c(.x, NA)) %>% unlist() tbl <- tbl[indices, ] %>% fill(rowid, start, duration, area) %>% group_by(rowid) %>% mutate( date = seq.Date( from = first(start), by ="month", length.out = first(duration) + 1 ), area = as.numeric(area) ) %>% ungroup() ggplot(tbl) + geom_ribbon(aes(x = date, fill = factor(rowid), ymax = 1, ymin = 0)) |
1 2 3 4 5 6 7 | ggplot(tbl) + geom_area( mapping = aes(x = date, y = area, fill = factor(rowid)), alpha = 0.3, position ="identity" ) + scale_x_date(limits = c(as.Date("1979-01-01"), Sys.Date())) |
由reprex软件包(v0.2.0)于2018-04-24创建。