绘制缺少日期范围R的时间序列

Plot time series with missing date ranges R

对我来说,可能微不足道但很难解决。

给定A中的startend日期,以及日期范围之间的duration in months

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))

我想产生类似于下面所示的图(忽略直方图)。每个duration的颜色均不同。在A中,第一个area值对应于日期范围等中的first month

如您所见,A中的日期不是连续的。因此,目的是针对给定的duration创建相对于startend日期的连续日期轴,例如ts <- seq(as.Date("1910-01-01"), as.Date("2015-12-31"), by="month")和阴影区域。

不记录任何值的日期范围应为NA.

如何使用任何程序包实现R?

想到的第一个想法是创建一个连续的日期,如下所示:

1
2
library(dplyr)
data_with_missing_times <- full_join(ts,A)

然后做图?这里有一个类似的问题,但我打算在此处遮盖日期范围。我的数据来自1910 - 2015,且缺少某些日期范围。

谢谢。

sample plot to reproduce


我不确定您要绘制的内容到底是什么,但这可以解决问题。奇怪的是,您将区域设置为因子形式而不是列表列,因为这会强制separate_rowsfilter而不是简单的unnest。此处的主要操作是为每个组添加一个额外的行,以使持续时间1具有两个日期值,然后根据这些分组添加正确的日期。这样,无论您选择哪种方式,我们都可以使用geom_ribbongeom_area绘制重叠的日期。

编辑:如果您通过这种方法进行研究,它的工作就是避免在时间序列中为每个月创建行,而仅在存在要绘制区域的地方创建观察值。如果要扩展x轴的限制,可以简单地调用scale_x_date并更改限制,但是它应该自动缩放到数据所在的位置。还更改了输入数据,使其不重叠,并更改了功能区图以使其匹配。

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))

>
</p>
<div class=

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()))

>
</p>
<p><center> <script src=

由reprex软件包(v0.2.0)于2018-04-24创建。