Установить переменную позицию для geom_segment на основе входных данных

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь добавить вертикальную линию к своему графику, которая служит в качестве опорной линии для выполнения метода эталонного теста. Однако я не могу понять, как я могу определить y значение -на основе моих данных.

Вот полностью воспроизводимый пример с желаемым графиком:

 library(tidyverse)
set.seed(16)
tibble("X"=rep(c("Reference.A", "1.A", "2.A", "Reference.B", "1.B", "2.B"),3), 
       "Decision"=c(rep("Type 1",6),rep("Type 2",6),rep("Type 3",6)), 
       "Outcome"=c(rnorm(n=6,mean=50,sd=5),rnorm(n=6,mean=30,sd=5),rnorm(n=6,mean=20,sd=5))) %>%
  ggplot(., aes(X, Outcome, color=Decision, shape=Decision, size=2))   geom_point(stroke=2, alpha = 0.8)   
  scale_x_discrete(limits=c("Reference.A", "1.A", "2.A", "Reference.B", "1.B", "2.B"))  
  geom_segment(aes(x = 1, y = 52.4, xend = 3, yend = 52.4), color="black", linetype="dashed", size=1)   
  geom_segment(aes(x = 4, y = 42.8, xend = 6, yend = 42.8), color="black", linetype="dashed", size=1) 
  

введите описание изображения здесь

Решение Outcome Type 1 Reference.A должно сравниваться с методами 1.A и 2.A , и, соответственно, для B -методов. Type 2 и Type 3 не должен указываться такой контрольной линией.

В примере я установил значения y вручную, но мои данные часто меняются, поэтому было бы идеально иметь гибкое решение. Кто-нибудь знает способ сделать это?

Ответ №1:

filter данные для вашего geom_segment слоя (вам нужен только один):

 tibble("X"=rep(c("Reference.A", "1.A", "2.A", "Reference.B", "1.B", "2.B"),3), 
       "Decision"=c(rep("Type 1",6),rep("Type 2",6),rep("Type 3",6)), 
       "Outcome"=c(rnorm(n=6,mean=50,sd=5),rnorm(n=6,mean=30,sd=5),rnorm(n=6,mean=20,sd=5))) %>% 
  ggplot(. , aes(X, Outcome, color=Decision, shape=Decision, size=2))   
  geom_point(stroke=2, alpha = 0.8)   
  scale_x_discrete(limits=c("Reference.A", "1.A", "2.A", "Reference.B", "1.B", "2.B"))  
  geom_segment(
    aes(x = c(1, 4), y = Outcome, xend = c(3, 6), yend = Outcome), 
    data = . %>% filter(Decision == 'Type 1', X %in% c('Reference.A', 'Reference.B')),
    color="black", linetype="dashed", size=1
  )
  

Это использует . %>% трюк для определения функциональной последовательности, поскольку вам нужно передать функцию в качестве аргумента данных, потому что вы передаете свои данные.

Альтернативно:

 d <- tibble("X"=rep(c("Reference.A", "1.A", "2.A", "Reference.B", "1.B", "2.B"),3), 
       "Decision"=c(rep("Type 1",6),rep("Type 2",6),rep("Type 3",6)), 
       "Outcome"=c(rnorm(n=6,mean=50,sd=5),rnorm(n=6,mean=30,sd=5),rnorm(n=6,mean=20,sd=5)))

ggplot(d , aes(X, Outcome, color=Decision, shape=Decision, size=2))   
  geom_point(stroke=2, alpha = 0.8)   
  scale_x_discrete(limits=c("Reference.A", "1.A", "2.A", "Reference.B", "1.B", "2.B"))  
  geom_segment(
    aes(x = c(1, 4), y = Outcome, xend = c(3, 6), yend = Outcome), 
    data = filter(d, Decision == 'Type 1', X %in% c('Reference.A', 'Reference.B')),
    color="black", linetype="dashed", size=1
  )