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)
有没有办法通过 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)