R ggplot的每个方面都有单独的abline

时间:2018-02-15 15:18:07

标签: r ggplot2 dplyr

我希望在下图中的每个方面都有一个独特的abline。

library(dplyr)
library(ggplot2)

ggplot(mpg, aes(x = hwy, y = displ, group = 1)) +         
  geom_point() + 
  geom_line() +
  facet_wrap(~ manufacturer, scales = "free")

abline只是一条水平线,等于每个方面上的'second to last' y值(displ)。例如,奥迪方面的倒数第二个y值为2.0,而雪佛兰方面的倒数第二个y值为3.5。最大的问题是我不知道如何通过facet对我的数据进行子集化(假设这是我应该采取的方法)。我假设FrankenSyntax将是:

geom_hline(data = subset(mpg, displ = DEPENDS ON FACET), 
  aes(yintercept = lead(mpg, FACET, 2nd to Last) & lag(mpg, FACET, 2nd to Last)), 
  color = "red"
)

我也不知道在这种情况下如何实现lead()lag()以提取倒数第​​二个值,以用作我的abline y-intercept。我知道必须有更好的方法来解决这个问题。

2 个答案:

答案 0 :(得分:2)

您可以实现计算mpg %>% arrange(hwy) %>% group_by(manufacturer) %>% mutate(icpet=nth(displ,-2))拦截值。

library(dplyr)
library(ggplot2)

ggplot(mpg %>% arrange(hwy) %>% group_by(manufacturer) %>% 
         mutate(icpet=nth(displ,-2)), 
       aes(x = hwy, y = displ, group = 1)) +         
  geom_point() + 
  geom_line() +
  facet_wrap(~ manufacturer, scales = "free") +
  geom_hline(aes(yintercept=icpet), colour="blue", lwd=2)

enter image description here

上述代码也可以写成:

mpg %>% arrange(hwy) %>% group_by(manufacturer) %>% 
  mutate(icpet=nth(displ,-2)) %>% 
  ggplot(aes(x = hwy, y = displ, group = 1)) +         
  geom_point() + 
  geom_line() +
  facet_wrap(~ manufacturer, scales = "free") +
  geom_hline(aes(yintercept=icpet), colour="blue", lwd=2) 

答案 1 :(得分:0)

普拉德普在那里百分之九十五。只需要一些修复。这是最后的答案。

library(dplyr)
library(ggplot2)

ggplot(mpg %>%
         arrange(hwy) %>% 
         group_by(manufacturer) %>% 
         mutate(ref.pt = nth(displ, -2)),
       aes(x = hwy, y = displ, group = 1)) + 
  geom_point() + 
  geom_line() +
  facet_wrap(~ manufacturer, scales = "free") +
  geom_hline(aes(yintercept = ref.pt), color = "red")