гистограмма с накоплением различий в R с использованием ggplot2 - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь получить столбчатую диаграмму в виде столбчатых столбцов с разностью AUC теста А и B

График должен выглядеть примерно так: enter image description here

Пример данных:

  df <- data.frame(test=rep(c("testA","testB"),2), AUC=c(0.8,0.9,0.6,0.3), reader=rep(c("reader1","reader2"),each=2))

Что я пробовал

Я знаю, как рассчитать разницу и назначить цвета ..

df %>% 
  spread(test,AUC) %>%
  group_by(reader) %>% 
  mutate(dif=testA-testB) %>%
  gather(key,value,testA:testB) %>% 
  mutate(color=case_when(is.negative(dif)~"green",TRUE~"red")) -> df

Где я терплю неудачу

Я точно не знаю, как получить составной график, используя ggplot2

Должно быть что-то вроде:

ggplot(df,aes(x=reader,y=value, fill=color...

1 Ответ

0 голосов
/ 30 ноября 2018

Я думаю, это то, что вы ищете:

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...