使用ggplot2

时间:2018-11-30 13:50:12

标签: r ggplot2 plot

我正在尝试获得一个堆积的条形图,其中有测试A和B的AUC的差异

该图应类似于此图: 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 :(得分:3)

我认为这就是您想要的:

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()
  • 取消否定任何diff负值(以便它们可以正确堆叠)
  • 通过读者和价值来作图,用颜色标签美学来填充
  • 堆叠它们并确保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