如何在ggplot2中对齐聚集条形图上的文本?

时间:2016-06-10 14:03:03

标签: r ggplot2 bar-chart

我正在尝试调整群集条形图中每个条形的百分比频率。现在,我的图表看起来像这样:

Rplot01

以下是代码:

ggplot(graph_data, aes(x, Freq)) +
    geom_bar(aes(fill = Pref), position = 'dodge', stat = 'identity') +
    geom_text(aes(label = sprintf("%.0f%%", round(Freq/sum(Freq) * 100))),
              hjust = -0.25) +
    labs(list(x = attr(graph_data, 'seg_label'),
              y = 'Frequency',
              title = paste('Q:', attr(graph_data, 'question')))) +
    scale_y_continuous(limits = c(0, 1.2 * max(graph_data$Freq))) +
    guides(fill = F) +
    coord_flip() +
    annotate("text", x = Inf, y = Inf,
             label = paste0("N = ", sum(graph_data$Freq)),
             hjust = 1.5, vjust = 1.5)

我认为问题可以通过这段代码来解决,但我不确定如何:

geom_text(aes(label = sprintf("%.0f%%", round(Freq/sum(Freq) * 100))), hjust = -0.25)

非常感谢任何帮助!

编辑:以下是我的数据结构示例:

df <- data.frame(x = rep(c('1824', '2534', '3544'), 3),
                 Pref = rep(c('low', 'neutral', 'high')),
                 Freq = 1:9 * 10)

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,我认为这是Position geom_text on dodged barplot的重复。

但我现在就做了,所以我会包含代码。

ggplot(df, aes(x, Freq, fill = Pref)) +
    geom_bar(position = 'dodge', stat = 'identity') +
    geom_text(aes(label = sprintf("%.0f%%", round(Freq/sum(Freq) * 100))),
          position = position_dodge(width = 0.9), hjust = -0.25) +
    labs(list(x = attr(df, 'seg_label'),
              y = 'Frequency',
              title = paste('Q:', attr(df, 'question')))) +
    scale_y_continuous(limits = c(0, 1.2 * max(df$Freq))) +
    guides(fill = F) +
    coord_flip()

您需要将fill放入原始aes中,以便geom_text知道躲避哪个标签的数量。

enter image description here