如何用ggplot2为绘图添加次级X轴?
问题:为ggplot添加基于波数转换的波长次级X轴
我有一幅以Wavenumber为X轴的折线图,数据表中已通过Wavelength = 1/Wavenumber生成对应的Wavelength列,想把Wavelength设为顶部的次级X轴,但使用sec_axis()时出错。
我的代码尝试
添加波长列的代码:
new_df_test <- new_df %>% mutate(Wavelength = 1 / Wavenumber)
原始绘图代码:
ggplot(new_df_test, aes(x = Wavenumber, y = X2024.05.17T12.35.56)) + geom_line()
尝试添加次级轴的代码:
ggplot(new_df_test, aes(x = Wavenumber, y = X2024.05.17T12.35.56)) + geom_line() + scale_x_continuous(sec.axis = sec_axis(label = Wavelength))
报错信息
Error in `sec_axis()`: ! Can't convert `transform`, `NULL`, to a function.hs.
数据集示例
structure(list(Wavenumber = c(648.5568, 652.2841, 656.0115, 659.7388, 663.4661, 667.1935), X2024.05.17T12.35.56 = c(0.013939, 0.013429, 0.011292, 0.008814, 0.009864, 0.006855), Wavelength = c(0.00154188499758232, 0.00153307431531751, 0.00152436352106632, 0.00151575138524519, 0.0015072360140179, 0.00149881556100292)), row.names = c(NA, 6L), class = "data.frame")
解决方法
出错的核心是sec_axis()的用法错误:这个函数不需要直接传入现有数据列,而是要定义主轴数值到次轴数值的转换函数,ggplot会自动基于主轴的刻度计算次轴刻度。
完整正确代码
library(ggplot2) library(dplyr) ggplot(new_df_test, aes(x = Wavenumber, y = X2024.05.17T12.35.56)) + geom_line() + scale_x_continuous( name = "波数", sec.axis = sec_axis( ~ 1 / ., # 波数转波长的公式,.代表主轴当前数值 name = "波长 (cm)", labels = scales::number_format(accuracy = 1e-6) # 控制标签显示精度 ) ) + labs(y = "信号值")
额外优化
如果需要将波长单位转换为纳米(1 cm = 10^7 nm),可以修改转换公式并调整标签:
ggplot(new_df_test, aes(x = Wavenumber, y = X2024.05.17T12.35.56)) + geom_line() + scale_x_continuous( name = "波数", sec.axis = sec_axis( ~ 10000000 / ., name = "波长 (nm)", labels = scales::number_format(accuracy = 0.1) ) ) + labs(y = "信号值")
说明
- 不需要预先计算
Wavelength列,直接通过转换公式即可生成次级轴,保留该列也不会影响绘图 sec_axis()的transform参数(即~1/.)是核心,用于定义主、次轴的数值映射关系
内容的提问来源于stack exchange,提问作者Keegan
相关产品推荐
相关产品推荐

