首页 > 解决方案 > 在几何区域中显示缺失日期的间隙

问题描述

我喜欢绘制数据的时间序列。但是,日期值存在一些差距,如下例所示。以下代码生成不考虑缺失日期的图。如何显示缺失的日期,即显示 2021-01-02 和 2021-01-04 以及类似的 2021-01-06 和 2021-01-08 之间的差距。

library(tidyverse)
fake.data <- data.frame(
  varA = c(0.6,0.5,0.2,0.3,0.7), 
  varB = c(0.1,0.2,0.4,0.6,0.2),
  varC = c(0.3,0.3,0.4,0.1,0.1),
  start_date = as.Date(c('2021-01-01','2021-01-02','2021-01-04','2021-01-06','2021-01-08')),
  stringsAsFactors = FALSE
)

fake.data %>% 
    gather(variable, value,varA:varC) %>% 
    ggplot(aes(x = start_date, y = value, fill = variable)) +
    geom_area()

标签: rggplot2

解决方案


我想最简单的方法是伪造间隙,例如使用 geom_rect。

考虑到“数据间隙”实际上是大多数使用线/面积图所固有的 - 一些纯粹主义者实际上可能完全反对为非连续测量显示线/面积,因为它建议连续测量。因此,因为无论如何它都是插值的,您可能会争辩说您可能不需要显示这些差距。

library(tidyverse)
fake.data <- data.frame(
  varA = c(0.6,0.5,0.2,0.3,0.7), 
  varB = c(0.1,0.2,0.4,0.6,0.2),
  varC = c(0.3,0.3,0.4,0.1,0.1),
  start_date = as.Date(c('2021-01-01','2021-01-02','2021-01-04','2021-01-06','2021-01-08'))
) %>% pivot_longer(cols = matches("^var"), names_to = "variable", values_to = "value" )

ls_data <- setNames(fake.data %>%
  complete(start_date = full_seq(start_date, 1)) %>% 
  split(., is.na(.$variable)), c("vals", "missing")) 

ggplot(ls_data$vals, aes(x = start_date, y = value, fill = variable)) +
  geom_area() +
  geom_rect(data = ls_data$missing, aes(xmin = start_date-.5, xmax = start_date+.5,
                                    ymin = 0, ymax = Inf), fill = "white") +
  theme_classic()

reprex 包于 2021-04-21 创建 (v2.0.0 )

考虑到上述情况 - 我可能倾向于不明确显示差距,而是更明确地显示测量结果。例如,使用 geom_point。

fake.data %>% 
  ggplot(aes(x = start_date, y = value, fill = variable)) +
  geom_area() +
  geom_point(position = "stack") +
  geom_line(position = "stack")


推荐阅读