ggplot2 双坐标轴实现
按照ggplot2作者的思路,双y轴会降低图片的易读性,不推荐使用,所以ggplot2没有单独双y轴设置,这里有一系列关于双轴的讨论[1][2]。只能通过scale_y_continuous()
与sec.axis
属性迂回实现[3]。
定义第二轴
sec.axis()
是scale_y_continuous()
的属性,sec.axis()
并非构建全新的Y轴。 它只是通过数学变换由第一个Y轴构建第二个Y轴。因此对于第二轴数据,在绘图前需要先按合适比例缩放,以保证缩放后值域在主轴数据值域内,随后绘制第二轴几何图形geom_x,再通过sec.axis()
里的trans
进行逆运算还原第二轴实际数值显示[4]。
具体实现如下:
# 定义缩放系数,系数根据左右轴的值域比例确定,找公约数,这样可以保证网格线对齐
coeff <- 10
ggplot(data, aes(x=day)) +
# 主轴几何对象正常绘制
geom_line( aes(y=temperature)) +
# 第二轴数据在绘制几何图形时进行缩放至主轴值域
geom_line( aes(y=price / coeff)) +
scale_y_continuous(
# 设置第一轴,左侧主轴
name = "First Axis",
# 增加右侧第二轴,并通过系数还原值显示
sec.axis = sec_axis(~.*coeff, name="Second Axis")
)
这里有相关例子可以参考辅助理解[5]。