通过scale_x_date()和ggplot2创建具有月x轴的年度图

Jas*_*lns 2 r ggplot2 lubridate

请考虑以下数据:

library(ggplot2)
library(lubridate)

date <- seq.Date(ymd("2015-01-01"), Sys.Date(), by = "day")

df <- data.frame(date = date,
                 value = seq_along(date) + rnorm(length(date), sd = 100))

# Add yday and year
df$yday <- yday(df$date)
df$year <- year(df$date)

head(df)
#         date value yday year
# 1 2015-01-01    97    1 2015
# 2 2015-01-02    89    2 2015
# 3 2015-01-03    68    3 2015
# 4 2015-01-04    57    4 2015
# 5 2015-01-05    70    5 2015
# 6 2015-01-06   100    6 2016
Run Code Online (Sandbox Code Playgroud)

我想制作一个"年复一年"的情节,颜色分配给年份.我可以用以下方法做到这一点:

ggplot(df, aes(x = yday, y = value, color = factor(year))) +
  geom_line()
Run Code Online (Sandbox Code Playgroud)

情节

但这导致x轴是"一年中的一天",而不是月份标签.添加+ scale_x_date()失败,因为yday它不再是日期.

有可能用scale_x_date()吗?

在一天结束时,我想做这样的事情:

ggplot(df, aes(x = date, y = value, color = factor(year))) +
  geom_line() +
  scale_x_date(date_labels = "%b")
Run Code Online (Sandbox Code Playgroud)

但是将这些年份"堆积"在同一个阴谋上.

eip*_*i10 8

这个黑客怎么样:我们不关心是哪一年yday来的,所以只需将其转换回Date格式(在这种情况下,年份将始终是1970年,无论实际年份yday来自哪个)并仅显示月份x轴标签.

您不需要在数据框中添加yday或添加year列,因为您可以在ggplot调用中动态创建它们.

ggplot(df, aes(x = as.Date(yday(date), "1970-01-01"), y = value, 
               color = factor(year(date)))) +
  geom_line() +
  scale_x_date(date_breaks="months", date_labels="%b") +
  labs(x="Month",colour="") +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

可能有一种更清洁的方式,希望有更熟练的R约会的人会出现并提供它.

在此输入图像描述