我有一个简单的ggplot折线图,在过去2年多的时间内按月 - 年(x =月份年,y =总和)绘制数据。我想每年添加背景阴影,以帮助区分月份和季节性。有没有办法做到这一点?如果不是,我将在每年的1月(2015年,2016年,2017年等)达成主要刻度线。在我的理想中,前12个数据点的背景是一种颜色,第二种是另一种颜色,依此类推。理想情况下,这将是未来的证据,因为随着时间的推移,我将不断向这个数据框添加数据。
答案 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))
geom_tile()
使用fill
美学来为瓷砖着色。颜色来自从year_month
变量中提取年份。
这可以通过调用str_sub()
包中的stringr
函数来实现
从字符向量中提取并替换子字符串。除了字符向量之外,该函数还使用两个参数start
和end
来指定要提取的第一个和最后一个字符的位置。 start
默认为1L
,因此只需指定end
位置。
如果将来时间序列将是extendend,配色方案将根据OP的要求自动采用。
参数alpha = 0.3
至geom_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" ...