You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:34:55