ggplot:geom_facet()斜率为geom_line()

时间:2015-04-10 23:52:13

标签: r ggplot2 visualization data-visualization facet-wrap

是否可以通过R或ggplot中facet_wrap()的斜率来geom_line,以便对于每个geom_line,具有正斜率的该行的所有区域都放在一个方面,所有具有负斜率的区域都放在另一个方面,所有没有斜坡的区域都放在第三方面?

在下面的最小例子中,例如,目标是将线a和b的上升段放置在正斜率面中,将线a和b的下降段放置在负面中,以及将线段放置在和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()

enter image description here

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

1 个答案:

答案 0 :(得分:1)

现在您希望将每个更改视为可以重新定位到其他方面的单独细分,您需要相应地转换数据。这是使用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)

enter image description here