ggplot:geom_facet() 按 geom_line() 的斜率

ggplot: geom_facet() by slope of geom_line()

有没有办法通过 R 或 ggplot 中的 geom_line 的斜率来 facet_wrap(),这样对于每个 geom_line,该直线的所有具有正斜率的区域都被放置在一个方面,所有具有负斜率的区域都放在另一个方面,所有没有斜率的区域都放在第三个方面?

例如,在下面的最小示例中,目标是将线 a 和 b 的上升段放置在正斜率面上,线 a 和 b 的下降段放置在负斜率面上,并且线段无斜面无斜面的 a 和 b:

library(ggplot2)
a.df <- data.frame(matrix(c('A',0,2,'A',1,6,'A',2,6,'A',3,4,'B',0,5,'B',1,4,'B',2,4,'B',3,6),ncol=3,byrow=TRUE))

a.df$X2 <- as.numeric(as.character(a.df$X2))
a.df$X3 <- as.numeric(as.character(a.df$X3))

ggplot(a.df, aes(x=X2,y=X3,colour=X1)) +
  geom_line()

我试过你的回复 MrFlick,但如果它们的 global 斜率是正的或负的,它看起来像是将线放在正或负斜率类别中。我想知道是否可以将具有正斜率或负斜率的每条线的所有 子区域 放入不同的面。有没有办法修改你的代码来完成这个任务?如果您能就此问题提供任何帮助,我将不胜感激。

既然您想将每个更改视为一个单独的段,您可以将其重新定位到不同的方面,那么您需要相应地转换数据。这是使用 dplyr

的方法
library(dplyr)

b.df <- a.df %>% group_by(X1) %>% arrange(X2) %>% 
    mutate(X4=lead(X2), X5=lead(X3), slopesign=sign(X5-X3))

ggplot(subset(b.df, !is.na(slopesign))) +
  geom_segment(aes(x=X2,y=X3, xend=X4, yend=X5, color=X1)) + 
  facet_wrap(~slopesign)