如何在ggplot2中的柱状图上同时显示计数和百分比?(R)

3

这是我的数据

data <- data.frame("Name" = c("Mark", "Jenny", "Linn"),
                   "Freq" = c("5","7", "3"),
                   "Percent" = c("33%", "47%", "20%"))

这是我的图表

ggplot(data, aes(x=Name, y=Freq)) + 
  geom_bar(stat="identity", color = "black", fill="dodgerblue1")+
  geom_text(label=data$Freq, vjust=-1)


我应该如何使百分比标签和频率标签同时显示,并最好用括号或逗号分隔?
4个回答

5

使用paste/paste0组合文本标签。

ggplot(data, aes(x = Name, y = as.numeric(Freq))) + 
  geom_bar(stat = "identity", color = "black", fill = "dodgerblue1")+
  geom_text(label = with(data, paste(Freq, paste0('(', Percent, ')'))), vjust=-1) +
  ylim(0, 8)

enter image description here


@FruityPebblePug,瑞的标签在这里非常好,但由于数据格式的原因,您的条形图比例不正确。7不是3的三倍,也不是1.5比5大。如果您不先将因素转换为数字,则会误导您的受众。 - Allan Cameron
@AllanCameron 我很感激你的关心,我只是快速创建了这个数据框,没有意识到它的格式不正确。谢谢! - RL_Pug

2

我认为如果你想绘制数值变量,那么确保它们是数字而不是因子非常重要,否则比例将会错误,就像你的示例一样:

data$Freq <- as.numeric(as.character(data$Freq))
labs <- paste0(format(100 * data$Freq/sum(data$Freq), digits = 4), "%")

ggplot(data, aes(x=Name, y=Freq)) + 
  geom_bar(stat="identity", color = "black", fill="dodgerblue1")+
  geom_text(label = labs, vjust=-1) + coord_cartesian(ylim = c(0, 8))

enter image description here


1
第一个优秀的答案使用了一种简单的通用策略来标记每个条形图,但在我的操作中没有起作用,因为as.numeric(Freq)返回c(2,3,1),而不是预期的c(5,7,3)(结果,我无法复制所示的图表)。第三个答案修复了因子问题,但没有按照问题中要求标记条形图。简单的解决方案是让频数成为数字,然后第一个答案就可以起作用:
data <- data.frame("Name" = c("Mark", "Jenny", "Linn"),
                   "Freq" = c(5,7,3),
                   "Percent" = c("33%", "47%", "20%"))

一旦我们有数字,我们可以让'R'计算百分比:

ggplot(data, aes(x = Name, y = Freq)) + 
  geom_bar(stat = "identity", color = "black", fill = "dodgerblue1") +
  geom_text(label = with(data, sprintf("%d (%.0f%%)",Freq, 100*Freq/sum(Freq))), vjust=-1)+
  ylim(0,8)

enter image description here


0

这是你要找的吗?

ggplot(data, aes(x=Name, y=Percent)) + 
  geom_bar(stat="identity", color = "black", fill="dodgerblue1")+
  geom_text(label=paste0("N = ",data$Freq), vjust=-1) +
  ylab("")


这很不错!但是另一个回答才是我所需要的。 - RL_Pug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接