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

如何在R ggplot2中设置非均匀Y轴刻度?

实现ggplot2非均匀Y轴刻度的两种方法

方法一:用ggbreak包创建断裂轴

针对你这种大量数据集中在小区间的场景,ggbreak包的断裂轴功能最直观——通过在Y轴设置断裂点,放大密集数值区间,压缩稀疏区间,完美突出1-10区间的细节。

示例代码

# 首次使用先安装包
# install.packages("ggbreak")

library(ggplot2)
library(ggbreak)

df <- data.frame(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 
                 y = c(1, 1.1, 1.9, 10, 100, 1, 1.1, 1.9, 13, 100))

p <- ggplot(df, aes(x, y)) +
    geom_point(size = 2) + 
    xlab(NULL) + 
    ylab(NULL) +
    # 在Y=10处设置断裂,1-10区间用原比例,10以上区间压缩为1/10比例
    scale_y_break(breaks = c(10), scales = c(1, 0.1)) +
    theme_classic()

p
  • breaks = c(10):指定Y轴断裂位置在10
  • scales = c(1, 0.1):控制两段区间的显示比例,第一段(1-10)正常显示,第二段(10-100)被压缩,放大第一段细节

方法二:自定义坐标轴转换函数

如果不想额外安装包,可以用scales包自定义转换规则,手动控制Y轴数值的映射逻辑。

示例代码

library(ggplot2)
library(scales)

df <- data.frame(x = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 
                 y = c(1, 1.1, 1.9, 10, 100, 1, 1.1, 1.9, 13, 100))

# 自定义转换规则:1-10区间线性映射,10以上区间压缩映射
custom_trans <- trans_new(
    name = "custom",
    # 转换函数:把Y>10的数值压缩10倍
    transform = function(y) {
        ifelse(y <= 10, y, 10 + (y - 10)/10)
    },
    # 逆转换函数:还原原始数值
    inverse = function(y) {
        ifelse(y <= 10, y, 10 + (y - 10)*10)
    },
    # 指定刻度位置:1-10设密集刻度,10以上设稀疏刻度
    breaks = function(x) {
        c(seq(1, 10, 1), seq(20, 100, 20))
    }
)

p <- ggplot(df, aes(x, y)) +
    geom_point(size = 2) + 
    xlab(NULL) + 
    ylab(NULL) +
    scale_y_continuous(trans = custom_trans) +
    theme_classic()

p

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:45:04