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]

Reference