【问题标题】:Add percentage labels to a stacked bar chart above bars将百分比标签添加到条形上方的堆积条形图
【发布时间】:2020-08-21 22:32:35
【问题描述】:

这与之前提出的一些问题非常相似,但更具体。这是我使用 ggplot 制作的堆积条形图。它显示了在 16 个不同实验室测试的 10 种不同抗体的阳性和阴性样本数量(为保护机密而更改了细节)。我想在每个条形图的顶部显示正百分比(即在条形图区域之外并悬停在绿色部分上方)。但是,对于那些没有空间的地方(例如“Lab 11”),它应该位于栏的绿色区域的内侧,并且可能带有白色文本以便显示出来。

这是我使用的代码:

bar <- ggplot(datas, aes(fill=Status, y=Number, x=Antibody)) + 
    geom_bar(position="stack", stat="identity") +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1),
    panel.spacing.x=unit(0.1, "lines") , panel.spacing.y=unit(0.1,"lines"),
    legend.position ="bottom") +
    facet_wrap(~Lab,nrow=4) + scale_fill_brewer(palette = "Set2")

如果我也应该发布数据,请告诉我(我真的不知道该怎么做)。

谢谢,

乔什


数据


这是一些假数据的输入:

datas = structure(list(Antibody = c("ab_1", "ab_1", "ab_1", "ab_1", "ab_1", 
"ab_1", "ab_2", "ab_2", "ab_2", "ab_2", "ab_2", "ab_2", "ab_3", 
"ab_3", "ab_3", "ab_3", "ab_3", "ab_3"), Lab = c("lab_1", "lab_1", 
"lab_2", "lab_2", "lab_3", "lab_3", "lab_1", "lab_1", "lab_2", 
"lab_2", "lab_3", "lab_3", "lab_1", "lab_1", "lab_2", "lab_2", 
"lab_3", "lab_3"), number_tests = c(1382, 1382, 1951, 1951, 1034, 
1034, 1382, 1382, 1951, 1951, 1034, 1034, 1382, 1382, 1951, 1951, 
1034, 1034), prop_pos = c(0.587053193943575, 0.587053193943575, 
0.587053193943575, 0.587053193943575, 0.587053193943575, 0.587053193943575, 
0.683785125147551, 0.683785125147551, 0.683785125147551, 0.683785125147551, 
0.683785125147551, 0.683785125147551, 0.279249225975946, 0.279249225975946, 
0.279249225975946, 0.279249225975946, 0.279249225975946, 0.279249225975946
), Status = c("npos", "nneg", "npos", "nneg", "npos", "nneg", 
"npos", "nneg", "npos", "nneg", "npos", "nneg", "npos", "nneg", 
"npos", "nneg", "npos", "nneg"), Number = c(799, 583, 1144, 807, 
606, 428, 945, 437, 1320, 631, 708, 326, 380, 1002, 554, 1397, 
276, 758)), row.names = c(NA, -18L), class = c("tbl_df", "tbl", 
"data.frame"))

【问题讨论】:

  • data在哪里?
  • 如果您将计数计算为一个新的数据框,并为每个构面和条形创建一个累积计数,然后使用geom_text 并提供此新数据作为输入。这也将调整 y 轴并将文本放在所有条形上方。
  • 您应该使用dput 添加数据,即dput(data)
  • 对不起,不明白如何使用dput。数据位于 .csv 文件中。如何在此处发布?
  • @jtr13 好点,但不幸的是,在这项研究中,重要的是要查看每个实验室的样本绝对数量以及每个实验室中每种抗体的阳性比例。

标签: r ggplot2 label percentage stacked-chart


【解决方案1】:

让我们尽量不要将我们的数据称为“数据”,因为这是 R 中的一个函数!

使用我在您的问题中编辑的数据。

您可以添加geom_text 来做您想做的事,该geom_text 只查看数据是否为阳性。

ggplot(datas, aes(fill=Status, y=Number, x=Antibody)) + 
 geom_bar(position="stack", stat="identity") +
 theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1),
       panel.spacing.x=unit(0.1, "lines") , panel.spacing.y=unit(0.1,"lines"),
       legend.position ="bottom") +
 facet_wrap(~Lab,nrow=4) + 
 scale_fill_brewer(palette = "Set2") +
 geom_text(data = data %>%
            filter(Status == "npos"), 
           aes(label = round(Number/number_tests, 3)),
           vjust = 0)


数据


library(tidyverse)
datas <- tibble(Lab = rep(paste0("lab_", 1:3), times = 3),
             Antibody = rep(paste0("ab_", 1:3), each = 3)) %>%
 group_by(lab) %>%
 nest() %>% 
 mutate(number_tests = round(runif(1, 1000, 2100))) %>%
 unnest(data) %>%
 group_by(antibody) %>%
 nest() %>% 
 mutate(prop_pos = runif(n = 1)) %>% 
 unnest(data) %>% 
 ungroup() %>% 
 mutate(npos = map2_dbl(number_tests, prop_pos,
                        ~ rbinom(n = 1, size = (.x), prob = .y)),
        nneg = number_tests - npos) %>%
 pivot_longer(cols = c(npos, nneg), names_to = "Status", values_to = "Number")

【讨论】:

  • 感谢@BrianLang。基于此,我应该能够弄清楚。
猜你喜欢
  • 2017-11-27
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多