如何使用 ggplot2 在不影响 R 中的其他行的情况下裁剪高于某个值的行?

How to crop a line when it's above a certain value without affecting other lines in R using ggplot2?

我正在尝试使用 ggplot2 包在 R 中创建图表。根据下面的简化示例,我可以毫无问题地制作图表:

library(tidyverse)

A <- c(10,9,8,7,6,5,4,3,2,1,2,3,4,5,6,7,8,9,10)
B <- c(15,14,13,12,11,10,9,8,7,6,7,8,9,10,11,12,13,14,15)
C <- rep(5,19)
D <- c(1:19)
data1 <- tibble(A, B, C, D)
data1 <- gather(data1, Type, Value, -D)

plot <- ggplot(data = data1, aes(x = D, y = Value))+
  theme_light()+
  geom_line(aes(colour = Type), size=0.75)+
  theme(legend.title = element_blank())

原始图表看起来像这样,但它们的制作方式与示例中的几乎相同:

问题是我想在 A(示例中为红色;原始图中为蓝色实线)达到 C(示例中为蓝色;原始图中为红色实线)时裁剪) 不影响 B(示例中为绿色;原始图中的其他所有内容)。

复杂的是我真的不想更改原始数据集的结构,所以我希望在创建绘图时有一种方法可以做到这一点?

非常感谢,

卡罗莱纳州

是的,您可以在 ggplot 调用中完成,方法是将数据框的过滤版本传递给 geom_linedata 参数:

ggplot(data = data1, aes(x = D, y = Value))+
  theme_light() +
  geom_line(aes(colour = Type), 
            data = data1 %>% 
              filter(!(Type == "A" & Value > mean(Value[Type == "C"]))), 
            size = 0.75)+
  theme(legend.title = element_blank())

但是,从您的原始图来看,我认为最简洁的方法是缩小 x 轴限制以“切断”下方蓝线与水平红线相交处的任一端,因为这根本不会影响上面的蓝色虚线。您可以使用 lims(x = c(0.25, 12.5) 切断数据,但通过设置 coord_cartesian(xlim = c(0, 12.5))

保留轴上 0 的下限