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

求助:如何在ggplot2翻转后的Y轴添加断裂轴(split/broken axis)

在ggplot2翻转坐标轴后添加断裂轴的问题

我正在用R的ggplot2绘图,想要给翻转后的Y轴(原X轴)添加断裂轴,但试了好几个小时,各种代码都达不到预期效果。我的数据集结构简单但数据量较大,Y轴是湖泊名称,X轴是叶绿素水平,目前生成的断裂轴效果怪异,不符合需求。


示例数据(LTyrone提供)

library(dplyr)
library(ggplot2) 
library(ggbreak)

# 示例数据
df <- data.frame(Name = c("Ellesworth",
                          "Elmer Thomas",
                          "Frederick",
                          "Lawtonka",
                          "Walters (Dave Boyer)",
                          "Waurika"),
                 Result = c(47, 248, 30, 45, 48, 43))

df$Name <- factor(df$Name)

我尝试过的代码

scale_y_break(c(60,240), scales="free")

scale_y_break(c(60,240), scales='free',expand = expansion(mult = c(0,.5)))

scale_y_cut(breaks=c(60,240), which=c(1, 3), scales=c(3, 5))

我的绘图代码

PB1_R_Data %>%
ggplot(., aes(x=Name, y = Result)) +

geom_col(aes(x=forcats::fct_rev(reorder(Name,Name)), y=MeanGrowSeason))+ 

(aes(x = Name, y = Result, fill = "Mean Chlorophyll a")) +

scale_fill_manual(name = NULL, values = c("Mean Chlorophyll a" = "#1ca6df")) +

geom_point(mapping=aes(y = `MaxGrowSeason`, pch = 16, color = "black"),  
size = 3, fill = "black", stat = "summary", fun=max)+

geom_hline(yintercept = 0, linetype = 'solid', color = 'black') +

geom_hline(aes(yintercept = 10, linetype = 'Middle'), color = "#d15420", 
size = 1) +

geom_hline(aes(yintercept = 20, linetype = 'Upper'), color = "#d15420", 
size = 1)+

labs(title = "PB1 (2002-2023)
Chlorophyll a for the Growing Season (May-Sep)",
x = "",
y=expression(plain("Chlorophyll ")~italic("a")~~plain("(mg/l)")), family="mono")+

labs(linetype='')+ 

theme_minimal() +
theme(axis.text=element_text(size=11,family = "Calibri", face="plain"),
legend.text = element_text(size=11,family = "Segoe UI", face="plain"),
axis.title.x = element_text(size=11, family = "Segoe UI", face="plain")) +

theme(text=element_text(size=12,family="Segoe UI"))+

theme(axis.text.x = element_text(angle=0))+
coord_flip() + 
 
scale_color_manual(values = c("#004e9a"),
labels = c("Maximum Chlorophyll a")) +
scale_shape_identity()+
labs(colour = "")+
theme(legend.position = "bottom")+
theme(plot.title = element_text(hjust = 0.5))

解决方案

你之前的核心错误是搞反了断裂轴的适用对象:断裂轴只能用于连续数值轴,不能用于分类轴。你要断裂的是叶绿素水平的数值轴(原Y轴,翻转后成X轴),而非湖泊名称的分类轴(原X轴,翻转后成Y轴)。

修正逻辑

  1. 先对原始的数值Y轴(叶绿素水平)应用scale_y_break添加断裂
  2. 再执行coord_flip()翻转坐标轴,确保断裂效果正确映射到翻转后的X轴

针对示例数据的修正代码

library(dplyr)
library(ggplot2) 
library(ggbreak)

df <- data.frame(Name = c("Ellesworth",
                          "Elmer Thomas",
                          "Frederick",
                          "Lawtonka",
                          "Walters (Dave Boyer)",
                          "Waurika"),
                 Result = c(47, 248, 30, 45, 48, 43))

df$Name <- factor(df$Name)

ggplot(df, aes(x = Name, y = Result)) +
  geom_col(fill = "#1ca6df") +
  # 对数值Y轴添加断裂区间60-240,scales参数控制断裂后轴的缩放比例
  scale_y_break(c(60, 240), scales = c(1, 0.2)) +
  coord_flip() +
  theme_minimal()

针对你实际绘图代码的修正

调整代码顺序,把scale_y_break放在coord_flip()之前,同时整理冗余的映射设置:

PB1_R_Data %>%
ggplot(., aes(x=Name)) +
  # 合并col的映射,避免重复设置x轴
  geom_col(aes(y=MeanGrowSeason, fill = "Mean Chlorophyll a"),
           x=forcats::fct_rev(reorder(Name,Name))) +
  geom_point(aes(y = `MaxGrowSeason`, pch = 16, color = "black"),  
             size = 3, fill = "black", stat = "summary", fun=max)+
  # 先对数值Y轴添加断裂
  scale_y_break(c(60, 240), scales = c(1, 0.2)) +
  # 再翻转坐标轴
  coord_flip() +
  # 其他标度与主题设置保持不变
  scale_fill_manual(name = NULL, values = c("Mean Chlorophyll a" = "#1ca6df")) +
  scale_color_manual(values = c("#004e9a"), labels = c("Maximum Chlorophyll a")) +
  scale_shape_identity()+
  labs(title = "PB1 (2002-2023)\nChlorophyll a for the Growing Season (May-Sep)",
       x = "",
       y=expression(plain("Chlorophyll ")~italic("a")~~plain("(mg/l)")), family="mono")+
  labs(linetype='', colour = "")+ 
  theme_minimal() +
  theme(axis.text=element_text(size=11,family = "Calibri", face="plain"),
        legend.text = element_text(size=11,family = "Segoe UI", face="plain"),
        axis.title.x = element_text(size=11, family = "Segoe UI", face="plain"),
        text=element_text(size=12,family="Segoe UI"),
        axis.text.x = element_text(angle=0),
        legend.position = "bottom",
        plot.title = element_text(hjust = 0.5))

额外说明

  • 如果需要调整断裂后两段轴的显示比例,可以修改scales参数,比如scales = c(1, 0.2)表示断裂前的轴缩放比例为1,断裂后的区间缩放为0.2,让大数值的部分更紧凑
  • 避免对分类轴使用断裂轴相关函数,这类函数仅支持连续数值变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:06:00