我有这种数据:
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
))
答案 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
))