数据可视化_科学统计图表4——ggplot绘制双轴图(双纵坐标、双y轴)
什么是双轴图
双轴的作用
双轴图是将两个不同量级的数据放在同一图像中显示的方法。如果不使用双轴图而直接将两组量级不同的数据放到同一图像中,就会造成一组低量级数据的极致压缩,见下图。由于红色点的数值太小,显示在图像上就会是一条直线。
Ggplot绘制双轴图
首先纠正一个认识上的错误,ggplot并不存在 “先绘制次轴,再按照次轴坐标将某组数据投放到图像上” 的功能。Ggplot能做的是将先按照主轴来绘制两类数据,之后再绘制次轴(也就是说次轴可以和数据不符,可以错误的展示数据)。这看上去像是一种欺骗,但同样可以通过一些方法使得次轴十分精准的展示数据。
绘制方法
首先为了将数据压缩,要用到等比映射的算法。映射的幅度要求是要能够全部包含小量级的数据(如果是将高量级数据向小量级映射)。而后再将主轴按照高量级数据的最小值最大值等比映射形成次轴。
以下是代码范例
library(ggplot2)
library(lubridate)
df <- economics[,c("date", "psavert", "uempmed")]
df <- df[year(df$date) %in% c(2004:2014), ]
#economics是ggplot2的内置展示数据
line_size = 1.2
text_size = 12
the_theme = theme_bw()+
theme(
axis.title.x = element_blank(),
panel.border = element_blank(),
axis.line.x = element_blank(),
axis.ticks.x = element_blank(),
axis.line.y.left = element_line(color = "red",size = line_size),
axis.line.y.right = element_line(color = "blue",size = line_size),
axis.ticks.y.left = element_line(color = "red"),
axis.ticks.y.right = element_line(color = "blue"),
axis.text.y.left = element_text(color = "red",size = text_size),
axis.text.y.right = element_text(color="blue",size = text_size),
axis.title.y.left = element_text(color="red",size = text_size+2),
axis.title.y.right = element_text(color="blue",size = text_size+2),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text.x = element_text(size = text_size),
plot.title = element_text(size=19),
plot.subtitle = element_text(size=13)
)
#定义一个主题,该主题与双轴画法无关,纯粹是为了美观而设定
ggplot(df,aes(x=date))+
geom_line(aes(y = psavert),color="red",size=line_size)+
geom_line(aes(y = rescale(uempmed,c(0,13)) ),color="blue",size=line_size)+
#画两条线
#注意第二条线,我将其等比映射到区间[0,13]。该区间能够完全包含小量级数据
ylab("Psavert")+
scale_y_continuous(limits = c(0,13),
sec.axis = sec_axis(name = "Uempmed",
~rescale(.,c(7.3,25.2))))+
#这里将主轴等比映射到7.3至25.2的区间
#7.3是高量级数据的最小值,25.2是其最大值
labs(title='Dual axis chart',
subtitle='Source: FRED Economic Research')+
the_theme