调整堆积条形图中的不一致

时间:2019-04-18 16:07:38

标签: r ggplot2 bar-chart

我有一个堆积的条形图,高度高度不相等。我想在每个栏的顶部显示百分比。

我到目前为止所做的是以下

df = structure(list(Type = c("Bronchoscopy", "Bronchoscopy", "Endoscopy", 
"Endoscopy"), Bacteremia = structure(c(1L, 2L, 1L, 2L), .Label = c("False", 
"True"), class = "factor"), count = c(2710L, 64L, 13065L, 103L
), perc = c(97.6928622927181, 2.3071377072819, 99.2178007290401, 
0.782199270959903)), class = c("grouped_df", "tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -4L), groups = structure(list(
Type = c("Bronchoscopy", "Endoscopy"), .rows = list(1:2, 
    3:4)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", 
"data.frame"), .drop = TRUE))

ggplot(df, aes(x = Type, y = perc, fill = Bacteremia)) +
geom_bar(stat = "identity") +
ylab("percent") + 
geom_text(aes(label = paste0(round(perc, 2), "%")), position = 
position_stack(vjust = -0.1), color = "black", fontface = "bold") 

我似乎无法正确使用vjust。底部栏和顶部栏的行为似乎不同。 我想要实现的是将百分比设置为略高于每个条的顶部边缘。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是一种可能的方法:

ggplot(df, aes(x = Type, y = perc, fill = Bacteremia)) +
  geom_bar(stat = "identity") +
  ylab("percent") + 
  geom_text(aes(label = paste0("", round(perc, 2), "%\n"), y = perc),
            color = "black", fontface = "bold", nudge_y = 2) 

我应该详细说明ggplot2将尝试相对于数据放置geom_text()。如果您试图水平对齐文本标签,则需要使用annotate()或提供带有typepercentBacteremia的标签数据集,然后在{ {1}},如下所示。

geom_text()

答案 1 :(得分:1)

这里是一种方法:

df <- 
  tibble(
    Type = c("Bronchoscopy", "Bronchoscopy", "Endoscopy", "Endoscopy"),
    Bacteremia = c("False", "True", "False", "True"),
    count = c(2710L, 64L, 13065L, 103L)
  ) %>% 
  group_by(Type) %>% 
  mutate(Percent = round((count / sum(count) * 100), 1))

df %>% 
  ggplot(aes(x = Type, y = Percent, fill = Bacteremia)) +
  geom_col() +
  geom_label(
    data = . %>% filter(Bacteremia == "True"), 
    aes(y = Percent + 5, label = str_c(Percent, "%")),
    show.legend = FALSE
  ) + 
  geom_label(
    data = . %>% filter(Bacteremia == "False"), 
    aes(y = 105, label = str_c(Percent, "%")),
    show.legend = FALSE
  )

在我的计算机上可以选择5和105,但是可能需要根据您的特定设置和纵横比进行一些调整。第一个geom_label调用基于精确的百分比设置y轴,而第二个调用将其设置在柱上方的恒定水平。

您可能还想使用geom_textgeom_label来尝试不同的颜色和标签设置。 geom_label的好处是,它可以很清楚地标记出哪个组。