首页 > 解决方案 > 使用 lubridate 和 ggplot 在条形图中的工作日顺序

问题描述

在创建 x 轴为工作日的条形图时(使用 lubridate 和 ggplot),我的工作日顺序不遵循时间顺序“周一、周二、周三...”

我试图复制这个问题,但正如你在下面看到的,在我的复制中,x 轴上的标签顺序如果没问题的话。

library(lubridate)
library(dplyr)

my_data <- data.frame(dates = sample(seq(as.Date('2010/01/01'), as.Date('2020/01/01'), by="day"), 100), 
                      group = rep(c(1,2,3,4), times = 5)) 
my_data <- my_data %>% 
  mutate(Weekdays = wday(dates, label = TRUE)) %>% 
  filter(Weekdays != "Sat" &
           Weekdays != "Sun")


ggplot(my_data, aes(Weekdays))+
  geom_bar()+
  facet_wrap(~group)

输出:

在此处输入图像描述

下面的代码是我对真实数据使用的。如您所见,工作日不按顺序排列。我不确定我的实际代码与上面尝试的复制在哪里不同。

library(ggplot2)

df1 <- filter(df, wday != "Sat")

ggplot(df1, aes(x = wday))+
  geom_bar()+
  facet_wrap(~Grouping)+
  theme(axis.text.x = element_text(angle =90, hjust = 1))

输出:

在此处输入图像描述

任何帮助/建议将不胜感激。

标签: rggplot2lubridate

解决方案


我认为这将是解决方案

my_data %>% 
  mutate(weekday = fct_reorder(weekdays(dates, abbreviate = TRUE), # generating week days
                               wday(dates))) %>% 
  filter(!weekday %in% c("Sat", "Sun")) %>% # here you filter saturday and sunday
  ggplot(aes(weekday)) + 
  geom_bar() + 
  facet_wrap(~ group)

如您所见, wday 函数给出了可与 fct_reorder 函数一起使用的有序数字。


推荐阅读