如何用coord_cartesian(xlim=..)创建X轴断裂?为何代码截断异常值?
解决ggplot中coord_cartesian截断异常值的问题
核心问题出在你的TotalP列是字符类型,不是数值型——ggplot处理离散x轴时,coord_cartesian()的xlim参数没法扩展轴范围,只会截断显示,导致400这个异常值被隐藏。下面给两种可行的解决方案:
方案一:修正数据类型 + 用coord_cartesian保留完整范围
先把TotalP转为数值型,再调整x轴刻度,既能保留常规区间的清晰刻度,又能包含异常值:
library(tidyverse) TotalPhosphorus <- tibble( Depth = c('1' ,'2', '3' , '1', '2', '3'), Date = c('1/18/2021', '1/18/2021', '1/18/2021', '7/11/2021', '7/11/2021', '7/11/2021'), DOY = c('18', '18', '18', '70', '70', '70'), Season= c("winter", "winter", "winter", "summer", "summer", "summer"), TotalP = as.numeric(c('20', '30', '400', '25', '30', '25')) # 转换为数值型 ) TotalPhosphorus %>% ggplot(aes(x = TotalP, y = Depth, colour = Season, group = Season)) + geom_point() + geom_path() + scale_x_continuous(breaks = c(0, 50, 100, 400), # 手动添加异常值刻度 limits = c(0, NA)) + # 固定下限0,上限自动适配数据 coord_cartesian(xlim = c(0, 400)) + # 确保显示范围覆盖异常值 theme_bw()
方案二:用ggbreak做断裂轴(适合异常值差距极大的场景)
如果异常值和常规数据差距过大,用断裂轴可以避免x轴被拉得过长,同时保留所有数据点:
library(tidyverse) library(ggbreak) TotalPhosphorus <- tibble( Depth = c('1' ,'2', '3' , '1', '2', '3'), Date = c('1/18/2021', '1/18/2021', '1/18/2021', '7/11/2021', '7/11/2021', '7/11/2021'), DOY = c('18', '18', '18', '70', '70', '70'), Season= c("winter", "winter", "winter", "summer", "summer", "summer"), TotalP = as.numeric(c('20', '30', '400', '25', '30', '25')) ) TotalPhosphorus %>% ggplot(aes(x = TotalP, y = Depth, colour = Season, group = Season)) + geom_point() + geom_path() + scale_x_continuous(breaks = c(0, 50, 100, 400)) + scale_x_break(c(120, 380), # 设置断裂区间,跳过中间无数据的范围 scales = 1) + theme_bw()
内容的提问来源于stack exchange,提问作者Daniela
相关产品推荐
相关产品推荐

