按日期绘制项目的出现

时间:2019-04-01 11:26:49

标签: r ggplot2

我有这种数据:

dat
     date shop_id
1 2013-01       1
2 2013-02       2
3 2013-02       2
4 2013-02       2
5 2013-02       1
6 2013-03       3
7 2013-04       1

shop_id代表特定商店,year_month代表日期。如果某个商店在特定日期列出,则表示该商店已开业,如果未关闭,则意味着该商店已关闭(即在2013 / 2013-01年Janury商店1在2013 / 2013-03年3月开业,但没有在2和3商店开业)商店3已营业,但商店1和2未营业)。由于数据与特定产品的销售有关,因此每个日期开店可能会多次。我想绘制数据。 它的外观应如下图所示:在y轴上应该是日期,在x轴上应该是shop_id,填充应该是商店是否开张(shop_id与特定日期一起出现)。

  dput(dat)
    structure(list(date = structure(c(1L, 2L, 2L, 2L, 2L, 3L, 4L), .Label = c("2013-01", 
"2013-02", "2013-03", "2013-04"), class = "factor"), shop_id = c(1, 
2, 2, 2, 1, 3, 1)), class = "data.frame", row.names = c(NA, -7L
))

enter image description here

1 个答案:

答案 0 :(得分:1)

这是您要寻找的吗?

library(tidyverse)
library(lubridate)

df %>%
  group_by(shop_id) %>%
  mutate(
    date = ymd(paste0(date, "-01")),
    start = min(date),
    end = max(date) %>% ceiling_date(unit = "month") # as Julian_Hn suggested
  ) %>%
  ungroup() %>%
  ggplot(aes(x = factor(shop_id))) +
  geom_linerange(aes(
      ymin = start,
      ymax = end
    ),
    size = 40 # bar width
  )

第二个命题:

library(tidyverse)

df %>%
  group_by(date) %>%
  nest() %>%
  arrange(date) %>%
  mutate(ypos = row_number()) %>%
  unnest() %>%
  ggplot() +
  geom_rect(aes(
    xmin = shop_id - .25,
    xmax = shop_id + .25,
    ymin = ypos - .5,
    ymax = ypos + .5
  ))