如何在R ggplot折线图中添加背景阴影或主刻度线?

时间:2017-02-04 09:26:31

标签: r graph ggplot2

我有一个简单的ggplot折线图,在过去2年多的时间内按月 - 年(x =月份年,y =总和)绘制数据。我想每年添加背景阴影,以帮助区分月份和季节性。有没有办法做到这一点?如果不是,我将在每年的1月(2015年,2016年,2017年等)达成主要刻度线。在我的理想中,前12个数据点的背景是一种颜色,第二种是另一种颜色,依此类推。理想情况下,这将是未来的证据,因为随着时间的推移,我将不断向这个数据框添加数据。

my plot

1 个答案:

答案 0 :(得分:0)

一种可能性是首先使用geom_tile()绘制一层彩色矩形,然后在顶部绘制点和线图层:

ggplot(df, aes(x = year_month, y = sum, group = 1)) + 
  geom_tile(aes(fill = stringr::str_sub(year_month, end = 4)),
            width = 1, height = Inf, alpha = 0.3) +
  labs(fill = "year") +
  geom_point() +
  geom_line() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

enter image description here

geom_tile()使用fill美学来为瓷砖着色。颜色来自从year_month变量中提取年份。

这可以通过调用str_sub()包中的stringr函数来实现 从字符向量中提取并替换子字符串。除了字符向量之外,该函数还使用两个参数startend来指定要提取的第一个和最后一个字符的位置。 start默认为1L,因此只需指定end位置。

如果将来时间序列将是extendend,配色方案将根据OP的要求自动采用。

参数alpha = 0.3geom_tile()使背景颜色透明,以便面板网格线透过。

labs(fill = "year")用于方便地重命名图例标题。

数据

不幸的是,OP还没有提供可重复的示例,因此有必要准备自己的样本数据:

set.seed(1234)
n_month <- 26
df <- data.frame(
  month = seq(as.Date("2015-01-01"), length.out = n_month, by = "month"),
  sum = rnorm(n_month, mean = 200000, sd = 50000)
)
df$year_month <- format(df$month, "%Y-%m")

str(df)
#'data.frame':  26 obs. of  3 variables:
# $ month     : Date, format: "2015-01-01" "2015-02-01" "2015-03-01" ...
# $ sum       : num  263119 207351 151471 271626 130593 ...
# $ year_month: chr  "2015-01" "2015-02" "2015-03" "2015-04" ...