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

如何在ggplot中为对数化的prob值添加右侧额外对数Y轴

实现带右侧对数Y轴的ggplot折线图

要给你的折线图添加右侧对数缩放的Y轴,同时对prob做对数转换,你可以借助ggplot2的sec_axis()函数实现——因为ggplot本身不支持独立的双Y轴,需要通过轴刻度的转换关系来关联左右轴。以下是两种实用的实现方式:

方式一:折线基于对数转换后的值,右侧显示原prob的对数刻度

这种方式先把prob转成对数数值来绘图,右侧轴再把对数数值还原为原prob的刻度:

library(ggplot2)

ggplot(df, aes(x = x_val)) +
  # 用log10转换后的prob值绘制折线
  geom_line(aes(y = log10(prob)), color = "#2196F3") +
  # 设置左侧Y轴:显示log10(prob)的数值
  scale_y_continuous(
    name = "log₁₀(prob)",
    breaks = seq(-5, -1, 1),
    labels = seq(-5, -1, 1),
    limits = c(-5, log10(max(df$prob)))
  ) +
  # 添加右侧Y轴:将对数数值还原为原prob的对数刻度
  scale_y_continuous(
    sec.axis = sec_axis(
      trans = ~ 10^.,  # 对数还原公式
      name = "prob(对数缩放)",
      breaks = c(0.00001, 0.0001, 0.001, 0.1, 0.3),
      labels = c("1e-5", "1e-4", "1e-3", "0.1", "0.3")
    ),
    limits = c(-5, log10(max(df$prob)))
  ) +
  labs(x = "x_val") +
  theme_minimal()

方式二:折线用原prob值,左右轴均为对数刻度

这种方式直接对Y轴做对数缩放,右侧轴显示转换后的对数数值:

library(ggplot2)

ggplot(df, aes(x = x_val, y = prob)) +
  geom_line(color = "#2196F3") +
  # 左侧Y轴:原prob的对数刻度
  scale_y_log10(
    name = "prob(对数缩放)",
    breaks = c(1e-5, 1e-4, 1e-3, 0.1, 0.3),
    labels = c("1e-5", "1e-4", "1e-3", "0.1", "0.3")
  ) +
  # 右侧Y轴:显示log10(prob)的数值
  scale_y_log10(
    sec.axis = sec_axis(
      trans = ~ log10(.),
      name = "log₁₀(prob)",
      breaks = c(1e-5, 1e-4, 1e-3, 0.1, 0.3),
      labels = function(x) round(log10(x), 1)
    )
  ) +
  labs(x = "x_val") +
  theme_minimal()

注意事项

  • 双Y轴容易造成数据解读混淆,务必保证左右轴的转换关系清晰可辨
  • 两种方式的核心是利用sec_axis()的trans参数定义左右轴的数值转换规则,确保刻度一一对应

内容的提问来源于stack exchange,提问作者A4747

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:12:36