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

如何在ggplot2的facet_wrap中混合线性与对数Y轴并适配轴文本

在ggplot2的facet_wrap中实现分面混合线性/对数Y轴

要在facet_wrap的不同分面中分别使用线性和对数Y轴,且保持轴标签可读性,无需借助ggpubr::ggarrange拼接图表,可通过ggh4x包的facetted_pos_scales函数实现——这是专门针对分面自定义坐标轴的高效解决方案。

解决方案代码

直接基于原始数据集绘图,无需手动转换数据,步骤如下:

library(tidyverse)
library(ggh4x)

# 原始数据集
df <- tibble(TIME = rep(1:10, 2),
             PARAM = rep(c("A", "B"), each = 10),
             VAL = c(seq.int(1, 50, length.out = 10),
                     c(1000, 100, 1, 5, 1, 10, 5, 10, 100, 1000)),
             Y_INT = rep(c(NA, 10), each = 10))

# 绘制混合尺度分面图
ggplot(data = df, aes(x = TIME, y = VAL)) +
  geom_line() +
  geom_hline(aes(yintercept = Y_INT), linetype = 2, color = "gray50") +
  facet_wrap(~PARAM, ncol = 1, scales = "free_y") +
  # 为每个分面单独配置Y轴
  facetted_pos_scales(
    y = list(
      # PARAM为A的分面使用线性轴
      PARAM == "A" ~ scale_y_continuous(trans = "identity"),
      # PARAM为B的分面使用对数轴,自定义刻度保证可读性
      PARAM == "B" ~ scale_y_continuous(
        trans = "log10",
        breaks = c(1, 10, 100, 1000),
        labels = c("1", "10", "100", "1000")
      )
    )
  )

代码说明

  • facetted_pos_scales支持为每个分面单独定义坐标轴规则,无需修改原始数据结构。
  • 对PARAM="B"的分面,通过trans="log10"应用对数变换,同时用breaks和labels指定轴刻度显示原始数值,避免手动转换数据导致的轴标签混乱问题。
  • 水平参考线geom_hline的Y_INT无需额外转换,ggplot会自动根据轴变换处理数值的绘图位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:40:21