在R 中如何在Y 轴上添加一个断点?

编程语言 2026-07-09

我有一个数据集,需要把“Year”作为因子来绘制箱线图,将y 轴在0.07到 1.5之间分段,并在数值为2 的位置添加一条水平线以指示阈值。我尝试使用下面的R 代码,但没成功。有什么建议吗?

以下是我的数据集和我至今使用的R 代码:

Sample_data <- structure(list(Year = c(2008L, 2008L, 2008L, 2008L, 2008L, 2008L, 
2008L, 2008L, 2008L, 2008L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2014L, 2014L, 2014L, 
2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2019L, 2019L, 
2019L, 2019L, 2019L, 2025L, 2025L, 2025L, 2025L, 2025L), Value = c(0.035, 
0.031, 0.027, 0.036, 0.026, 2, 2, 2, 2, 2, 0.027, 0.026, 0.037, 
0.0173, 0.032, 2, 2, 2, 2, 2, 0.032, 0.038, 0.038, 0.025, 0.036, 
2, 2, 2, 2, 2, 0.022, 0.016, 0.031, 0.026, 0.017, 2, 2, 2, 2, 
2, 0.022, 0.014, 0.027, 0.016, 0.024, 0.019, 0.021, 0.022, 0.02, 
0.039), Treshold = c(2L, 2L, 2L, 2L, 2L, NA, NA, NA, NA, NA, 
2L, 2L, 2L, 2L, 2L, NA, NA, NA, NA, NA, 2L, 2L, 2L, 2L, 2L, NA, 
NA, NA, NA, NA, 2L, 2L, 2L, 2L, 2L, NA, NA, NA, NA, NA, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L)), row.names = c(NA, -50L), class = "data.frame")

library(ggplot2)
library(ggbreak)

p = ggplot() + 
      geom_boxplot(data=Sample_data,aes(x=factor(Year) ,y=Value)) +
      geom_col() + 
      scale_y_break(c(0.0, 0.07)) +
      geom_hline(yintercept = 2, color = "red", 
                 linetype = "solid",linewidth=1)
p

解决方案

我从你昨天的评论中得到的最佳猜测是,你想把y 轴的大部分范围裁剪掉,从0.07到 1.99,保持y 轴断点的宽度一致,在顶部区域仅显示1.99和 2的断点标签,并且不显示次坐标轴。

我能够用昨天评论中的代码完成前三项,但在我同时使用 scale_y_continuous(用来指定断点宽度,因为我在 scale_y_break 中看不到如何设置)和 scale_y_break 时,似乎会出现一个意外的结果,即创建了一个二级坐标轴。作为一个临时的变通,我们可以把主题中的刻度和文本删掉,但最好还是从一开始就避免创建二级坐标轴。

ggplot() + 
  geom_boxplot(data=Sample_data, aes(x = factor(Year), y = Value)) +
  scale_y_break(c(0.07, 1.99)) +
  scale_y_continuous(breaks = scales::breaks_width(0.01)) +
  geom_hline(yintercept = 2, color = "red", linetype = "solid", linewidth = 1) +
  theme(
    axis.text.y.right = element_blank(),
    axis.ticks.y.right = element_blank(),
    axis.title.y.right = element_blank()
  )

在此输入图片描述

我不愿意箱线图不显示中位数,这让我很困扰,因此另一种版本(也许是个灾难性的版本?)可以使用两组断点,与 scale_y_break(c(0.05, 1, 1.04, 1.99)) +

在此输入图片描述

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章