在时间序列图中标记一段时间

Posted

技术标签:

【中文标题】在时间序列图中标记一段时间【英文标题】:Mark a period of time in a time-series-plot 【发布时间】:2020-03-23 01:32:36 【问题描述】:

首先,让我们创建一些假数据:

d <- c("2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04", "2019-01-03", "2019-04-06", "2019-04-03", "2019-05-07", "2019-05-03", "2019-05-03", "2019-05-03", "2019-05-03", "2019-06-03", "2019-06-03", "2019-06-03", "2019-06-03", "2019-06-03", "2019-06-03", "2019-06-03", "2019-07-03", "2019-07-03", "2019-07-04", "2019-08-03", "2019-09-05", "2019-09-03", "2019-09-03", "2019-09-06", "2019-09-08", "2019-10-03", "2019-11-03", "2019-11-03", "2019-11-03", "2019-11-03", "2019-11-03", "2019-11-03", "2019-12-03", "2019-12-03")

df <- data.frame(dates=as.Date(d))

现在,我创建一个时间序列图:

# aggregate data
df_plot <- df %>% mutate(month = lubridate::floor_date(dates, "month")) %>% 
  group_by(month) %>% summarise(count = n())

# plot data
ggplot(aes(x = month, y = count), data = df_plot) + geom_line() +
  scale_x_date() +
  geom_vline(xintercept = as.numeric(as.Date("2019-01-30")), linetype=4)

使用geom_vline(xintercept = as.numeric(as.Date("2019-01-30")), linetype=4),我可以用垂直线标记某个日期。是否还有可能用彩色框或其他东西标记时间-范围(比如说从 2019 年 1 月 30 日到 2019 年 2 月 15 日)?

【问题讨论】:

sthda.com/english/wiki/… - 查找geom_ribbon,有一个geom_rect的例子 【参考方案1】:

geom_rectymin = -Infymax = Inf 一起使用。

xmin <- as.Date("2019-01-30")
xmax <- as.Date("2019-02-15")

ggplot(df_plot, aes(month, count)) + 
  geom_line() +
  scale_x_date() +
  geom_rect(aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf, 
    alpha = I(.1), fill  = I("lightblue"))) +
  annotate("text", label = "Some text", x = xmin, y = Inf, angle = 90,
    hjust = 1.1, vjust = -1)

(截图后继续)

另一种可能性是创建一个数据框regimes 来保存边界和标签。这与之前的代码类似,但如果我们必须添加更多规则,只需向regimes 添加行即可。

regimes <- data.frame(xmin = as.Date("2019-01-30"),
                      xmax = as.Date("2019-02-15"),
                      label = "Some text")

ggplot(regimes) + 
  geom_line(aes(month, count), df_plot) +
  scale_x_date() +
  geom_rect(aes(xmin = xmin, xmax = xmax, ymin = -Inf, ymax = Inf), 
    alpha = I(.5), fill = I("lightblue")) +
  geom_text(aes(x = xmin, y = Inf, label = label), angle = 90, 
    hjust = 1.1, vjust = -1)

【讨论】:

以上是关于在时间序列图中标记一段时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 achartengine 的时间序列图中标记/注释某些区域

[散点图][Plotly][Python] 如何在散点图中标记心形

使用“大小”参数时调整散点图中的标记大小

如何在 MATLAB 2014b 的散点图中增加图例的标记大小? [复制]

如何在python的散点图中添加具有不同标记的多个图例?

如何在 Plotly 3D 散点图中设置点标记的样式/格式?