求助:如何在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轴)。
修正逻辑
- 先对原始的数值Y轴(叶绿素水平)应用
scale_y_break添加断裂 - 再执行
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
相关产品推荐
相关产品推荐

