使用geom_bar [R]设置ggplot中标签中断的起点

时间:2018-12-05 10:57:06

标签: r ggplot2

我正在使用ggplot中的条形图制作时间序列。当我将休息时间设置为2个月(使其比使用1个月更清晰,但比使用1年更有用)时,它从第二个月开始计算。我注意到,如果我设置了不同的数字,也会发生同样的事情-如果我设置为3,则标签将从3月开始,依此类推。

如果我制作折线图,则不会发生这种情况-休息时间从第一个月开始,但仍然有两个月度休息时间。

如何使标签从第一个月开始,然后从该月份开始设置休息时间?我也很高兴他们从上个月开始倒数。

这是我的代码:

library(ggplot2)
library(lubridate)

num_month <- seq(from = as.Date("2016-01-01"), to = Sys.Date(), by='month')
month_data <- as.data.frame(matrix(0, ncol = 0, nrow = length(num_month)))
month_data$month <- as.Date(num_month)
month_data$month_char <- format(month_data$month,"%Y-%m")
month_data$freq <- sample(100, size = nrow(month_data), replace = TRUE)
month_data <- month_data[!(month_data$month_char %in% current_month),]
random_bar_ts <- ggplot(month_data, aes(x = month, y = freq)) + 
    geom_bar(stat = "identity") + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 12)) +
    scale_x_date(labels = date_format("%b-%y"), breaks = "2 months", expand = c(0,0))
random_bar_ts

random_line_ts <- ggplot(month_data, aes(x = month, y = freq)) + 
    geom_line() + 
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 12)) +
    scale_x_date(labels = date_format("%b-%y"), breaks = "2 months", expand = c(0,0))
random_line_ts

这是两个情节的样子: geom_bar example

geom_line example

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这确实是不直观的,并且看起来没有参数可以直接移动标签。但是,您可以做的就是真正轻松地手动设置这些中断,特别是因为在这种情况下,您的数据可以很好地排序:

ggplot(month_data, aes(x = month, y = freq)) + 
  geom_bar(stat = "identity") + 
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 12)) +
  scale_x_date(labels = date_format("%b-%y"), expand = c(0, 0),
               breaks = month_data$month[c(TRUE, FALSE)])

enter image description here

即使您有某种不规则的数据,也可以按两个月的时间间隔轻松设置间隔(间隔似乎与scale_x_date相同或几乎相同)

with(month_data, seq(min(month), max(month), by = "2 months"))
#  [1] "2016-01-01" "2016-03-01" "2016-05-01" "2016-07-01" "2016-09-01" "2016-11-01" "2017-01-01"
#  [8] "2017-03-01" "2017-05-01" "2017-07-01" "2017-09-01" "2017-11-01" "2018-01-01" "2018-03-01"
# [15] "2018-05-01" "2018-07-01" "2018-09-01" "2018-11-01"