ggplot x轴上的月度日期刻度以天为单位

时间:2019-07-23 14:46:56

标签: r ggplot2

在绘制带有每月数据的条形图时,ggplot会缩短2月和3月之间的距离,从而使图表看起来不一致here is an example

  require(dplyr)
  require(ggplot2)  
  require(lubridate)


## simulating sample data 

set.seed(.1073)
my_df <- data.frame(my_dates = sample(seq(as.Date('2010-01-01'), as.Date('2016-12-31'), 1), 1000, replace = TRUE))


### aggregating + visualizing counts per month 

my_df %>%  
  mutate(my_dates = round_date(my_dates, 'month')) %>%  
  group_by(my_dates) %>%  
  summarise(n_row = n()) %>%  
  ggplot(aes(x = my_dates, y = n_row))+ 
  geom_bar(stat = 'identity', color = 'black',fill = 'slateblue', alpha = .5)+
  scale_x_date(date_breaks = 'months', date_labels = '%y-%b') +
  theme(axis.text.x = element_text(angle = 60, hjust = 1)) 

3 个答案:

答案 0 :(得分:1)

您可以将其转换为因子变量以用作轴,并使用label参数将格式固定为scale_x_discrete。

library(dplyr)
library(ggplot2)


my_df %>%  
  mutate(my_dates = factor(round_date(my_dates, 'month'))) %>% 
  group_by(my_dates) %>%  
  summarise(n_row = n()) %>%  
  ggplot(aes(x = my_dates, y = n_row))+ 
  geom_bar(stat = 'identity', color = 'black',fill = 'slateblue', alpha = .5)+
  scale_x_discrete(labels = function(x) format(as.Date(x), '%Y-%b'))+
  theme(axis.text.x = element_text(angle = 60, hjust = 1)) 

编辑:另一种方法来解决可能丢失的月份,该月份在图中应表示为空白。

library(dplyr)
library(ggplot2)
library(lubridate)


to_plot <- 
  my_df %>%  
    mutate(my_dates = round_date(my_dates, 'month'),
           my_dates_ticks = interval(min(my_dates), my_dates) %/% months(1))

to_plot %>% 
  group_by(my_dates_ticks) %>%  
  summarise(n_row = n()) %>%  
  ggplot(aes(x = my_dates_ticks, y = n_row))+ 
  geom_bar(stat = 'identity', color = 'black',fill = 'slateblue', alpha = .5)+
  scale_x_continuous(
    breaks = unique(to_plot$my_dates_ticks),
    labels = function(x) format(min(to_plot$my_dates) + months(x), '%y-%b'))+
  theme(axis.text.x = element_text(angle = 60, hjust = 1)) 

答案 1 :(得分:1)

使用IceCream答案中的某些部分,您可以尝试一下。 注意,在这种情况下,现在建议使用geom_col

my_df %>%  
  mutate(my_dates = factor(round_date(my_dates, 'month'))) %>% 
  group_by(my_dates) %>%  
  summarise(n_row = n()) %>%  
  ungroup() %>% 
  mutate(my_dates_x = as.numeric(my_dates)) %>% 
  mutate(my_dates_label = paste(month(my_dates,label = T), year(my_dates))) %>% 
  {ggplot(.,aes(x = my_dates_x, y = n_row))+ 
   geom_col(color = 'black',width = 0.8, fill = 'slateblue', alpha = .5) +
  scale_x_continuous(breaks = .$my_dates_x, labels = .$my_dates_label) + 
  theme(axis.text.x = element_text(angle = 60, hjust = 1))}

enter image description here

答案 2 :(得分:1)

我将日期保留为日期而不是因素。是的,因素将使条的大小保持一致,但是您必须记住在缺少的任何月份都加入,这样就不会跳过空白的月份,并且容易使因素混乱。我建议您调整美学,以减少黑色轮廓线对2月和3月之间间隙的影响。

这里有两个例子:

  • 将轮廓颜色调整为白色。这样会降低对比度并使间隙变得不那么明显。
  • 将宽度设置为20(天)。

顺便说一句,您无需汇总数据,可以在较早的步骤中使用floor_date()round_date()并直接进入geom_bar()

dates <- seq(as.Date("2010-01-01"), as.Date("2016-12-31"), 1)

set.seed(.1073)
my_df <-
  tibble(
    my_dates = sample(dates, 1000, replace = TRUE),
    floor_dates = floor_date(my_dates, "month")
  )

ggplot(my_df, aes(x = floor_dates)) +
  geom_bar(color = "white", fill = "slateblue", alpha = .5)

ggplot(my_df, aes(x = floor_dates)) +
  geom_bar(color = "black", fill = "slateblue", alpha = .5, width = 20)

enter image description here