如何让折线图中的每一年变成不同的颜色

问题描述

我已经看到其他问题,这些问题是用条形图和柱形图完成的,但没有用折线图完成。我将如何使每年的背景是单独的颜色?另外,您如何将它放在刻面之间没有明显间隙的地方?

 Month1 <- c(201811,201812,20191,20192,20193,20194,20195,20196,20197,20198,20199,201910,201911,201912,20201,20202,20203,20204,20205,20206,20207,20208,20209,202010,202011)
Rate <- 
c(3.2,3.3,3.4,3.1,3.0,2.9,2.6,2.5,2.3,2.1,1.6,1.7,1.5,1.1,-0.4,-19.5,-17.6,-10.5,-9.6,-9.1,-8.6,-8.0,-7.7)

 cesyoy <- data.frame(Month1,Rate)

 #Chart
 library(ggplot2)
 library(dplyr)
 library(lubridate)
 library(scales)
 library(odbc)

##日期

linechart<-cesyoy %>% mutate(year = substr(as.character(Month1),1,4),month = substr(as.character(Month1),5,7),date = as.Date(paste(year,month,"1",sep ="-"))) %>%  
 ggplot()+geom_line(aes(x=date,y=Rate),color="red")+
 scale_y_continuous(labels =scales::percent)+
 scale_x_date(date_breaks="1 month",date_labels="%b\n",expand = c(0,0))+
 facet_wrap(.~year,scales = 'free_x',strip.position = 'bottom')+
 theme(panel.grid.major= element_blank(),axis.text.x = element_text(angle = 90,size=rel(0.6)),panel.spacing = unit(0,"lines"),strip.placement = 'outside',strip.background = element_blank())+
 ggtitle("Employment 
 Growth (%)")

解决方法

如果您想为每年更改背景颜色,您可以添加一个 geom_rect 并按年份填充。

解决跨方面的折线问题更为复杂。 Here is a possible solution

编辑:请参阅下面的第一个图表,了解非构面解决方案。

library(dplyr)
library(ggplot2)

cesyoy %>% 
  mutate(year = substr(as.character(Month1),1,4),month = substr(as.character(Month1),5,7),date = as.Date(paste(year,month,"1",sep ="-"))) %>%  
  ggplot() + 
  geom_line(aes(x = date,y = Rate)) +
  geom_rect(xmin = -Inf,ymin = -Inf,xmax = Inf,ymax = Inf,alpha = 0.1,aes(fill = year)) +
  facet_wrap(~year,scales = "free_x") +
  scale_y_continuous(labels = scales::percent) +
  scale_x_date(date_breaks="1 month",date_labels="%b\n",expand = c(0,0)) + 
  ggtitle("Employment  Growth (%)") +
  theme(panel.grid.major = element_blank(),axis.text.x = element_text(angle = 90,size = rel(0.6)),panel.spacing = unit(0,"lines"),strip.placement = 'outside',strip.background = element_blank()) +
  scale_fill_brewer(palette = "Spectral") + 
  guides(fill = FALSE)

enter image description here

非构面解决方案

创建新变量 max_datemin_date,它们是每年的开始日期和结束日期。然后使用这些作为 geom_rect 的基础。

cesyoy %>% 
  mutate(year = substr(as.character(Month1),sep ="-"))) %>% 
  group_by(year) %>% 
  mutate(min_date = as.Date(paste(year,"01",sep = "-")),max_date = as.Date(paste(year,"12","31",sep = "-"))) %>% 
  ungroup() %>% 
  ggplot(aes(date,Rate)) + 
  geom_line() + 
  geom_rect(aes(xmin = min_date,xmax = max_date,fill = year),alpha = 0.1) +
  scale_fill_brewer(palette = "Spectral") +
  guides(fill = FALSE)

enter image description here