今天,我们来学习另一种常见的图形,面积图。什么是面积图呢?面积图是一种源于折线图但是改变了其展现方式的图形。具体地,它通过一定的区域面积来表示数据大小,利用不同的颜色或者线条来区别不同组的数据。
我们还是用ggplot来画一个基本的面积图。使用的是一个US economic time series的名叫economics的数据。我们选择其中的两列数据:psavert和uempmed。
library(ggplot2)
library(lubridate)
library(tidyverse)
df <- economics[,c("date", "psavert", "uempmed")]
然后挑选了2000-2014年的数据。
df2 <- df %>%filter(year(df$date) %in% c(2000:2014))
我们先看一下这2个变量的分布。
ggplot(df2,aes(x=date))+
geom_line(aes(y=psavert),color="red")+
geom_line(aes(y=uempmed),color="blue")
从图中可以看出uempmed是要比psavert大的。所以如果我们要把2个面积分布放在一张图中就要注意顺序问题。
ggplot(df2,aes(x=date))+
geom_area(aes(y=uempmed,fill="uempmed"))+
geom_area(aes(y=psavert,fill="psavert"))
比如我们先画了uempmed,后画了psavert。没有遮挡问题。
但是,如果我们调一下顺序:
ggplot(df2,aes(x=date))+
geom_area(aes(y=psavert,fill="psavert"))+
geom_area(aes(y=uempmed,fill="uempmed"))
因为小的先画了,ggplot是一层层望上添加图层的,小的图层就遮挡了。
ggplot(df2,aes(x=date))+
geom_area(aes(y=uempmed,fill="uempmed"))+
geom_area(aes(y=psavert,fill="psavert"))+
theme_bw()+
theme(legend.title = element_blank())+
scale_fill_brewer(palette = "Paired")+
labs(title='Area Chart of Returns Percentage',subtitle='Source: FRED Economic Research')+
ylab("Returns%")+
xlab('Year')
如果想彼此互不遮挡,我们可以先画大的,然后第二层利用前面的加和,这样显示的就是完全第二个的大小了。有点类似堆积面积图。
ggplot(df2,aes(x=date))+
geom_area(aes(y=uempmed+psavert,fill="psavert"))+
geom_area(aes(y=uempmed,fill="uempmed"))+
theme_bw()+
theme(
legend.title = element_blank()
)+
scale_fill_brewer(palette = "Paired")+
labs(title='Area Chart of Returns Percentage',
subtitle='Source: FRED Economic Research')+
ylab("Returns%")+
xlab('Year')
如果我们只想要画两条曲线中间的差值区域的话,通过geom_ribbon函数来实现。
ggplot(df2,aes(x=date))+
geom_ribbon(aes(ymin = if_else(uempmed > psavert, psavert, uempmed),
ymax = if_else(uempmed > psavert, uempmed , psavert)),
fill = "#decbe4", color = "black")