如何在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
相关产品推荐
相关产品推荐

