仅使用每个月的第一个字母创建ggplot2 x轴月份标签

时间:2017-10-17 18:16:15

标签: r ggplot2 axis labels

我知道使用scale_x_date(date_labels="%b"...)创建包含每个月前三个字母的刻度标签。有没有办法只包括每个月的第一个字母?因此标签不是"Jan Feb March...",而是"J F M..."

以下是一个例子:月份标签重叠,所以我希望能够将标签更改为第一个字母。

library(lubridate)
library(ggplot2)


set.seed(2)
df = data.frame(Date=seq(as.Date("2010-01-01"),as.Date("2015-12-31p
                                                   "), by="1 day"))
df$value = cumsum(rnorm(nrow(df)))


p = ggplot(df, aes(Date, value)) +
  geom_vline(xintercept=as.numeric(df$Date[yday(df$Date)==1]), colour="grey60") +
  geom_line() +
  scale_x_continuous(labels = year_labels <- rep(c('J','F','M','A','M','J','J','A','S','O','N','D'),5)) +
  theme_bw() +
  theme(panel.grid.minor.x = element_blank()) +
  labs(x="")
p

enter image description here

我尝试将行scale_x_date(date_labels="%b", date_breaks="month", expand=c(0,0))更改为scale_x_continuous(labels = year_labels <- rep(c('J','F','M','A','M','J','J','A','S','O','N','D'),5))

但这产生了以下错误

  

as.Date.numeric(value)出错:&#39; origin&#39;必须提供

2 个答案:

答案 0 :(得分:1)

我找到了办法。有没有人知道一种更简单的方法来产生相同的输出?

jersey-hk2

enter image description here

答案 1 :(得分:1)

我认为最好的方法是使用包pretty_breaks中的scales。它不会产生您请求的输出,但我认为它更好,并且可以平滑地处理任何长度的数据。

library(ggplot2)
library(scales)

set.seed(2)
df = data.frame(Date=seq(as.Date("2010-01-01"),as.Date("2014-12-31p
                                               "), by="1 day"))
df$value = cumsum(rnorm(nrow(df)))

p = ggplot(df) +
   geom_line( aes(Date, value), size=0.1) +
   scale_y_continuous(name= "Title of y [units]")+
   scale_x_date(breaks=pretty_breaks(), date_minor_breaks="1 month") + 
   theme_bw() 
p

enter image description here

enter image description here

我在这里更改了date_minor_breaks="6 months"以避免超过 enter image description here

美好而简单!!