我知道使用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
我尝试将行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;必须提供
答案 0 :(得分:1)
答案 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
我在这里更改了date_minor_breaks="6 months"
以避免超过月
美好而简单!!