首页 > 解决方案 > 我想将每个类别的计数百分比作为标签添加到我的 ggplot 饼图

问题描述

我正在使用代码:

age_pie_chart <- ggplot(data = data , aes(x = "", fill = `Q1: How old are you?`))+
  geom_bar(position = "fill", width = 1) + 
  coord_polar(theta = "y") + xlab("") + ylab("") +  blank_theme + scale_fill_grey()+
  theme(axis.text.x=element_blank())
age_pie_chart

我希望将每个类别的百分比添加到图表中。通过搜索我了解到我需要使用 geom_text 函数,但在此之前我需要构建一个频率表,其中包含每个类别的计数百分比。

这是饼图

标签: rggplot2pie-chart

解决方案


这是一个带有一些虚拟数据的示例。首先,这是虚拟数据。我sample()用来选择值,然后我通过仅添加 2 个值来确保我们有一个“小”切片Q1 = "-15"

set.seed(1234)
data <- data.frame(
  Q1 = c(sample(c('15-7','18-20','21-25'), 98, replace=TRUE), rep('-15', 2))
)

对于情节,它与您的情节基本相同,尽管您不需要widthgeom_bar().

要正确定位文本,您需要使用geom_text(). 您可以在绘图之前计算频率,或者您可以ggplotgeom_bar使用图层一样即时计算频率。stat="count"geom_text()

图书馆(ggplot2)

ggplot(data=data, aes(x="", fill=Q1)) +
  geom_bar(position="fill") +
  geom_text(
    stat='count', 
    aes(y=after_stat(..count..),
        label=after_stat(scales::percent(..count../sum(..count..),1))),
    position=position_fill(0.5),
  ) +
  coord_polar(theta="y") +
  labs(x=NULL, y=NULL) +
  scale_fill_brewer(palette="Pastel1") +
  theme_void()

在此处输入图像描述

所以要清楚这一geom_text()行发生了什么:

  • 我正在使用stat="count". 我们想在图中访问该计数统计信息,因此我们需要指定使用该特殊统计功能。

  • 我们..count..在美学范围内使用。 这里的关键是,为了访问该..count..值,我们需要先计算 stat 函数。您可以使用该after_stat()函数来指定 stat 函数应该在映射美学之前首先发生 - 这..count..可以在aes()!

  • 标签的百分比计算。这通过..count../sum(..count..). 我正在使用scales::percent()一种将标签格式化为百分比的方法。

  • 位置 = 填充。像条形几何一样,我们也需要使用position="fill". 您需要指定使用实际position_fill()方法,因为它允许我们访问vjust参数。这会将每个文本值定位在每个切片的“中间”。如果你只是设置position="fill",你会得到位于每个切片边缘的文本。


推荐阅读