如何在不同组中使用 geom_bar() 调整条形图条形图条数为零的 geom_text() 位置?

问题描述 投票:0回答:1

我正在尝试在包含两组的条形图的条形顶部添加值。对于大于零的值它工作得很好。 但我也有没有计数的级别,因此条形的高度为 0。然后条形顶部带有计数的文本位于中间,而不是条形的正上方。而计数为0的地方没有任何指示。

这是一个数据集:

vec.feed1.sorted <- c(rep(2,1), rep(3,2), rep(4,7), rep(5,15), rep(6,30), rep(7,40))
vec.feed1 <- sample(vec.feed1.sorted)
set.seed(001)
vec.feed1

df.feedback <- data.frame(
    study = factor(c(rep(1,62),rep(2,33)), levels=c("1","2")),
    feed1 = factor(vec.feed1, levels=as.character(c(1:7)))
  )
df.feedback

这就是我到目前为止所做的:

ggplot(data = df.feedback, 
       aes(x = factor(feed1, levels = 1:7, labels = labels.feed1),
           fill = factor(study))) +
  geom_bar(aes(y = after_stat(count / ave(count, fill, FUN = sum))), 
           position = position_dodge(preserve="single")) +
  scale_fill_manual(
    values = c("grey40", "grey60"),
    name = "event location",
    labels = c("university", "cinema")) +
  geom_text(aes(y = after_stat(count / ave(count, fill, FUN = sum)),
                label = after_stat(scales::percent(count / ave(count, fill, FUN = sum), accuracy = 1))),
            stat = "count", position = position_dodge(width=0.9), vjust = -0.5) +
  ylab("percent of audience relative to location") +
  xlab("How did you like this event?") +
  theme(axis.text.x = element_text(angle = 45, hjust = .9)) +
  #theme(axis.ticks.x = element_blank()) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 0.51)) +
  scale_x_discrete(drop = FALSE) +
  theme(
    panel.border = element_rect(linetype = "solid", colour = "black", linewidth = .5, fill = NA),
    panel.grid.minor = element_line(colour = "grey93", linewidth = .3),
    panel.grid.major.y = element_line(colour = "grey93", linewidth = .3),
    panel.background = element_rect(fill = "grey97")
  ) +
  theme(axis.title.x.bottom = element_text(margin = margin(t = .15, unit = "in")))

这是我得到的情节:

enter image description here

我希望“2%”和“3%”位于栏上方的中间。

如果您能帮助我,我会很高兴。 最好的,H.

r ggplot2 geom-bar geom-text
1个回答
0
投票

您可以使用

annotate
在您想要的位置手动添加标签。

library(tidyverse)

set.seed(001)

vec.feed1.sorted <- c(rep(2,1), rep(3,2), rep(4,7), rep(5,15), rep(6,30), rep(7,40))
vec.feed1 <- sample(vec.feed1.sorted)

df.feedback <- data.frame(
  study = factor(c(rep(1,62),rep(2,33)), levels=c("1","2")),
  feed1 = factor(vec.feed1, levels=as.character(c(1:7)))
)

ggplot(data = df.feedback, 
       aes(x = factor(feed1, levels = 1:7),
           fill = factor(study))) +
  geom_bar(aes(y = after_stat(count / ave(count, fill, FUN = sum))), 
           position = position_dodge(preserve="single")) +
  scale_fill_manual(
    values = c("grey40", "grey60"),
    name = "event location",
    labels = c("university", "cinema")) +
  annotate('text',
           x = c(1.8,2.8,3.8,4.2,4.8,5.2,5.8,6.2,6.8,7.2),
           y = c(0.05,0.05,0.09,0.11,0.18,0.17,0.28,0.44,0.50,0.32),
           label = c('3%','3%','6%','9%','16%','15%','26%','42%','48%','30%')) + # make adjustments to position and labels here
  ylab("percent of audience relative to location") +
  xlab("How did you like this event?") +
  theme(axis.text.x = element_text(angle = 45, hjust = .9)) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 0.51)) +
  scale_x_discrete(drop = FALSE) +
  theme(
    panel.border = element_rect(linetype = "solid", colour = "black", linewidth = .5, fill = NA),
    panel.grid.minor = element_line(colour = "grey93", linewidth = .3),
    panel.grid.major.y = element_line(colour = "grey93", linewidth = .3),
    panel.background = element_rect(fill = "grey97")
  ) +
  theme(axis.title.x.bottom = element_text(margin = margin(t = .15, unit = "in")))

创建于 2024-07-01,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.