简体   繁体   中英

exclude weekends from x axis in heatmap

I have coded a heatmap using ggplot tiles and it has sequencial days on the x axis . The problem I am trying to solve is to remove weekends from the heatmap and show only weekdays. I have found that one solution would be to transform the dates into factors but if I do that how can I format the labels in scale_x_discrete to be in %d%m date format ? Is there a way to keep the dates as date format instead of turning it into factors ? Below is an example:

    randomString <- function(n=5,length=3) {
  randomStringX <- c(1:n)
  for(i in 1:n) {
    randomStringX[i] <- paste(sample(c(LETTERS),length,replace = TRUE),collapse = "")
  }
  return(randomStringX)
}
randomString()
data.frame(client=randomString(),day=rep(seq.Date(Sys.Date()-10,length.out=10,by="1 day"),2)) %>% mutate(sales=round(rnorm(20,492,300),1)) %>% mutate(scale=cut(sales,breaks=c(0,100,200,300,max(sales)),labels = c("0-100","100-200","200-300","+300"))) %>%  ggplot(.,aes(x=day,y=client,fill=scale)) + geom_tile() + scale_x_date(date_breaks = "1 day")

Thanks in advance

You can exclude data from weekends using the is.weekend function from chron

The weekend dates themselves can be excluded from an x-axis using the bdscale package

library(chron)
library(bdscale)
library(scales)
library(ggplot2)
library(dplyr)

df <- as.data.frame(client = randomString(), day = rep(seq.Date(
  Sys.Date() - 10, length.out = 10, by = "1 day"), 2)) %>%
  mutate(sales = round(rnorm(20, 492, 300), 1)) %>%
  mutate(scale =
           cut(
             sales,
             breaks = c(0, 100, 200, 300, max(sales)),
             labels = c("0-100", "100-200", "200-300", "+300")
           )) %>% 
  filter(is.weekend(day) == FALSE)

  ggplot(df, aes(x = day, y = client, color = scale, fill = scale)) + 
  geom_tile() + 
  # scale_x_date(date_breaks = "1 day") +
  theme(axis.text.x = element_text(angle = 45)) +
  scale_x_bd(business.dates = sort(df$day), max.major.breaks = 30, labels=scales::date_format('%d %b'))

Removing data from weekends can also be done using lubridate and the wday function as filter(!wday(day) %in% c(1,7)) Sun/Sat are stored as 1 and 7 respectively. - Credit to @AHart

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM