使用 calendR(或其他包?)标记日期向量

Mark vector of dates using calendR (or other package?)

我有一个日期向量,其中包含每个日期的特定访问量和特定的访问类型。

数据('ficol'列可以忽略):

structure(c("2021-06-15", "15", "60", "T0s", "2021-06-16", "15", 
"60", "T0s", "2021-06-17", " 8", "32", "T0s", "2021-06-21", "15", 
"60", "T0s", "2021-06-22", "15", "60", "T0s", "2021-06-23", "15", 
"60", "T0s", "2021-06-24", "15", "60", "T0s", "2021-06-28", "15", 
"60", "T0s", "2021-06-29", "15", "60", "T0s", "2021-06-30", "15", 
"60", "T0s", "2021-07-01", "15", "60", "T0s", "2021-07-05", "15", 
"60", "T0s", "2021-07-06", "15", "60", "T0s", "2021-07-07", "15", 
"60", "T0s", "2021-07-08", "15", "60", "T0s", "2021-07-12", "15", 
"60", "T0s", "2021-07-13", "15", "60", "T0s", "2021-07-14", "15", 
"60", "T0s", "2021-07-15", "15", "60", "T0s", "2021-07-19", "15", 
"60", "T0s", "2021-07-20", "15", "60", "T0s", "2021-07-21", "15", 
"60", "T0s", "2021-07-22", "15", "60", "T0s", "2021-07-26", "15", 
"60", "T0s", "2021-07-27", "15", "60", "T0s", "2021-07-28", "15", 
"60", "T0s", "2021-07-29", "15", "60", "T0s", "2021-06-30", "30", 
"60", "T1s", "2021-07-01", " 8", "16", "T1s", "2021-07-05", "26", 
"52", "T1s", "2021-07-06", "30", "60", "T1s", "2021-07-07", "30", 
"60", "T1s", "2021-07-08", " 4", " 8", "T1s", "2021-07-12", " 4", 
" 8", "T1s", "2021-07-13", "29", "58", "T1s", "2021-07-14", "27", 
"54", "T1s", "2021-07-20", "30", "60", "T1s", "2021-07-21", "30", 
"60", "T1s", "2021-07-26", "30", "60", "T1s", "2021-07-27", "30", 
"60", "T1s", "2021-07-28", "30", "60", "T1s", "2021-08-02", "30", 
"60", "T1s", "2021-08-03", " 8", "16", "T1s", "2021-08-23", "12", 
"60", "T3s", "2021-08-24", "12", "60", "T3s", "2021-08-25", "12", 
"60", "T3s", "2021-08-26", " 2", "10", "T3s", "2021-08-30", "12", 
"60", "T3s", "2021-08-31", "12", "60", "T3s", "2021-09-01", "12", 
"60", "T3s", "2021-09-06", "12", "60", "T3s", "2021-09-07", "12", 
"60", "T3s", "2021-09-08", "12", "60", "T3s", "2021-09-13", "12", 
"60", "T3s", "2021-09-14", "12", "60", "T3s", "2021-09-15", "12", 
"60", "T3s", "2021-09-16", "12", "60", "T3s", "2021-09-20", "12", 
"60", "T3s", "2021-09-21", "12", "60", "T3s", "2021-09-22", "12", 
"60", "T3s", "2021-09-23", "12", "60", "T3s", "2021-09-27", "12", 
"60", "T3s", "2022-01-10", "15", "60", "T5s", "2022-01-11", "15", 
"60", "T5s", "2022-01-12", " 8", "32", "T5s", "2022-01-17", "15", 
"60", "T5s", "2022-01-18", "15", "60", "T5s", "2022-01-19", " 6", 
"24", "T5s", "2022-01-24", "15", "60", "T5s", "2022-01-25", "15", 
"60", "T5s", "2022-01-26", " 6", "24", "T5s", "2022-01-31", "15", 
"60", "T5s", "2022-02-01", "15", "60", "T5s", "2022-02-02", " 6", 
"24", "T5s", "2022-02-03", "12", "48", "T5s", "2022-02-07", "15", 
"60", "T5s", "2022-02-08", "15", "60", "T5s", "2022-02-09", " 6", 
"24", "T5s", "2022-02-10", "15", "60", "T5s", "2022-02-14", " 9", 
"36", "T5s"), .Dim = c(4L, 80L), .Dimnames = list(c("Var1", "Freq", 
"ficol", "visit"), NULL))

我想要的是有一个带有日期(数据中的 Var1)的日历,每个访问类型都用颜色标记。例如,访问T0s日期为绿色,T1s日期为紫色,T3s日期为蓝色等。

我找到了 calendR 包,但整整一年都弄不明白,只能每月使用此处找到的示例:。 https://r-coder.com/calendar-plot-r/

谁能帮帮我?非常感谢!

library(tidyverse)
library(lubridate)
library(assertr)
library(calendR)


df <- structure(c("2021-06-15", "15", "60", "T0s", "2021-06-16", "15", 
                  "60", "T0s", "2021-06-17", " 8", "32", "T0s", "2021-06-21", "15", 
                  "60", "T0s", "2021-06-22", "15", "60", "T0s", "2021-06-23", "15", 
                  "60", "T0s", "2021-06-24", "15", "60", "T0s", "2021-06-28", "15", 
                  "60", "T0s", "2021-06-29", "15", "60", "T0s", "2021-06-30", "15", 
                  "60", "T0s", "2021-07-01", "15", "60", "T0s", "2021-07-05", "15", 
                  "60", "T0s", "2021-07-06", "15", "60", "T0s", "2021-07-07", "15", 
                  "60", "T0s", "2021-07-08", "15", "60", "T0s", "2021-07-12", "15", 
                  "60", "T0s", "2021-07-13", "15", "60", "T0s", "2021-07-14", "15", 
                  "60", "T0s", "2021-07-15", "15", "60", "T0s", "2021-07-19", "15", 
                  "60", "T0s", "2021-07-20", "15", "60", "T0s", "2021-07-21", "15", 
                  "60", "T0s", "2021-07-22", "15", "60", "T0s", "2021-07-26", "15", 
                  "60", "T0s", "2021-07-27", "15", "60", "T0s", "2021-07-28", "15", 
                  "60", "T0s", "2021-07-29", "15", "60", "T0s", "2021-06-30", "30", 
                  "60", "T1s", "2021-07-01", " 8", "16", "T1s", "2021-07-05", "26", 
                  "52", "T1s", "2021-07-06", "30", "60", "T1s", "2021-07-07", "30", 
                  "60", "T1s", "2021-07-08", " 4", " 8", "T1s", "2021-07-12", " 4", 
                  " 8", "T1s", "2021-07-13", "29", "58", "T1s", "2021-07-14", "27", 
                  "54", "T1s", "2021-07-20", "30", "60", "T1s", "2021-07-21", "30", 
                  "60", "T1s", "2021-07-26", "30", "60", "T1s", "2021-07-27", "30", 
                  "60", "T1s", "2021-07-28", "30", "60", "T1s", "2021-08-02", "30", 
                  "60", "T1s", "2021-08-03", " 8", "16", "T1s", "2021-08-23", "12", 
                  "60", "T3s", "2021-08-24", "12", "60", "T3s", "2021-08-25", "12", 
                  "60", "T3s", "2021-08-26", " 2", "10", "T3s", "2021-08-30", "12", 
                  "60", "T3s", "2021-08-31", "12", "60", "T3s", "2021-09-01", "12", 
                  "60", "T3s", "2021-09-06", "12", "60", "T3s", "2021-09-07", "12", 
                  "60", "T3s", "2021-09-08", "12", "60", "T3s", "2021-09-13", "12", 
                  "60", "T3s", "2021-09-14", "12", "60", "T3s", "2021-09-15", "12", 
                  "60", "T3s", "2021-09-16", "12", "60", "T3s", "2021-09-20", "12", 
                  "60", "T3s", "2021-09-21", "12", "60", "T3s", "2021-09-22", "12", 
                  "60", "T3s", "2021-09-23", "12", "60", "T3s", "2021-09-27", "12", 
                  "60", "T3s", "2022-01-10", "15", "60", "T5s", "2022-01-11", "15", 
                  "60", "T5s", "2022-01-12", " 8", "32", "T5s", "2022-01-17", "15", 
                  "60", "T5s", "2022-01-18", "15", "60", "T5s", "2022-01-19", " 6", 
                  "24", "T5s", "2022-01-24", "15", "60", "T5s", "2022-01-25", "15", 
                  "60", "T5s", "2022-01-26", " 6", "24", "T5s", "2022-01-31", "15", 
                  "60", "T5s", "2022-02-01", "15", "60", "T5s", "2022-02-02", " 6", 
                  "24", "T5s", "2022-02-03", "12", "48", "T5s", "2022-02-07", "15", 
                  "60", "T5s", "2022-02-08", "15", "60", "T5s", "2022-02-09", " 6", 
                  "24", "T5s", "2022-02-10", "15", "60", "T5s", "2022-02-14", " 9", 
                  "36", "T5s"), .Dim = c(4L, 80L), .Dimnames = list(c("Var1", "Freq", 
                                                                      "ficol", "visit"), NULL))
df1 <- df %>%
  t() %>%
  as_tibble() %>%
  mutate(
    Var1 = ymd(Var1),
    Freq = as.integer(Freq),
    ficol = as.integer(ficol)) %>%
  rename(date = Var1) %>% 
  arrange(date)

df2 <- df1 %>%
  filter(year(date) == 2021) # choose only 1 year
df2
#> # A tibble: 62 x 4
#>    date        Freq ficol visit
#>    <date>     <int> <int> <chr>
#>  1 2021-06-15    15    60 T0s  
#>  2 2021-06-16    15    60 T0s  
#>  3 2021-06-17     8    32 T0s  
#>  4 2021-06-21    15    60 T0s  
#>  5 2021-06-22    15    60 T0s  
#>  6 2021-06-23    15    60 T0s  
#>  7 2021-06-24    15    60 T0s  
#>  8 2021-06-28    15    60 T0s  
#>  9 2021-06-29    15    60 T0s  
#> 10 2021-06-30    15    60 T0s  
#> # ... with 52 more rows

# some days have many types of visits, so it's necessary to group them
df3 <- df2 %>%
  group_by(date) %>%
  summarise(visits = str_c(sort(visit), collapse = ", "),
            .groups = "drop")
df3
#> # A tibble: 48 x 2
#>    date       visits  
#>    <date>     <chr>   
#>  1 2021-06-15 T0s     
#>  2 2021-06-16 T0s     
#>  3 2021-06-17 T0s     
#>  4 2021-06-21 T0s     
#>  5 2021-06-22 T0s     
#>  6 2021-06-23 T0s     
#>  7 2021-06-24 T0s     
#>  8 2021-06-28 T0s     
#>  9 2021-06-29 T0s     
#> 10 2021-06-30 T0s, T1s
#> # ... with 38 more rows
df3 %>%
  count(visits)
#> # A tibble: 4 x 2
#>   visits       n
#>   <chr>    <int>
#> 1 T0s         13
#> 2 T0s, T1s    14
#> 3 T1s          2
#> 4 T3s         19

df4 <- df3 %>%
  mutate(color = case_when(
    visits == "T0s" ~ "red",
    visits == "T0s, T1s" ~ "orange",
    visits == "T1s" ~ "yellow",
    visits == "T3s" ~ "green"
  )) %>%
  assertr::verify(!is.na(color)) %>%
  full_join(
    tibble(date = seq(as.Date("2021-01-01"), as.Date("2022-01-01") - 1, by = "days")),
    by = "date"
  ) %>%
  mutate(yday = lubridate::yday(date)) %>%
  arrange(date)
df4 %>%
  filter(!is.na(visits))
#> # A tibble: 48 x 4
#>    date       visits   color   yday
#>    <date>     <chr>    <chr>  <dbl>
#>  1 2021-06-15 T0s      red      166
#>  2 2021-06-16 T0s      red      167
#>  3 2021-06-17 T0s      red      168
#>  4 2021-06-21 T0s      red      172
#>  5 2021-06-22 T0s      red      173
#>  6 2021-06-23 T0s      red      174
#>  7 2021-06-24 T0s      red      175
#>  8 2021-06-28 T0s      red      179
#>  9 2021-06-29 T0s      red      180
#> 10 2021-06-30 T0s, T1s orange   181
#> # ... with 38 more rows

calendR::calendR(year = 2021,
                 start = "M",
                 special.days = df4$visits,
                 special.col = unique(na.omit(df4$color)),
                 legend.pos = "right")