#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
)