Я думаю, это то, что вы ищете:
library(tidyverse)
Это ваш кадр данных из вопроса, я просто создал его по-другому и сделал преднамеренный фактор для вычисления.
data.frame(
test = factor(rep(c("testA", "testB"), 2), levels = c("testA", "testB")),
AUC = c(0.8, 0.9, 0.6, 0.3),
reader = rep(c("reader1", "reader2"), each = 2),
stringsAsFactors = FALSE
) -> xdf
Теперь мы:
- сгруппируем по считывающему устройству
- обеспечиваем правильную организацию тестов
- вычисляем разницу и сохраняем
testA
AUC - сделать его длиннее по сравнению с шириной
- назначить цвет через метку, чтобы мы могли использовать шкалу, чтобы получить легенду
- установить уровни цветового фактора, чтобы мы могли расположить ихпрямо в
geom_col()
- не отменять отрицательные значения различий (чтобы они могли правильно складываться)
- график по считывателю и значению, заполняя цветовой меткой эстетический
- стеки убедитесь, что
testA
находится внизу - Установите пределы Y на 0,1 и назовите ось правильно
- Установите эстетику оси X в соответствии с изображением, которое вы нам дали
- Используйте ручную заливку, чтобы получить RGB (только с цветами цветоводителя)
- Используйтеледяная тема (хотя я сильно склонен к этому)
Что делается с помощью:
group_by(xdf, reader) %>%
arrange(test) %>%
summarise(
diff = diff(AUC),
testA_auc = AUC[1]
) %>%
gather(measure, value, -reader) %>%
mutate(color = case_when(
measure == "diff" & (sign(value) == -1) ~ "Decrease with Test B",
measure == "diff" & (sign(value) > -1) ~ "Increase with Test B",
measure == "testA_auc" ~ "Test A"
)) %>%
mutate(
color = factor(
x = color,
levels = c("Test A", "Increase with Test B", "Decrease with Test B")
)
) %>%
mutate(value = abs(value)) %>%
ggplot(aes(reader, value, fill = color)) +
geom_col(position = position_stack(reverse = TRUE)) +
scale_y_continuous("Estimated AUC", limits = c(0, 1)) +
scale_x_discrete("Reader", labels = c("1", "2")) +
scale_fill_manual(
name = NULL,
values = c(
"Test A" = "#2166ac",
"Increase with Test B" = "#5aae61",
"Decrease with Test B" = "#b2182b"
)
) +
hrbrthemes::theme_ipsum_rc(grid = "Y")