r - 我想将每个类别的计数百分比作为标签添加到我的 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 函数,但在此之前我需要构建一个频率表,其中包含每个类别的计数百分比。
解决方案
这是一个带有一些虚拟数据的示例。首先,这是虚拟数据。我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))
)
对于情节,它与您的情节基本相同,尽管您不需要width
为geom_bar()
.
要正确定位文本,您需要使用geom_text()
. 您可以在绘图之前计算频率,或者您可以ggplot
像geom_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"
,你会得到位于每个切片边缘的文本。
推荐阅读
- python - 用于避免张量构造的嵌套循环的 Numpy 解决方案
- reactjs - 类型错误:this.state.schedulelistnew.map 不是函数
- excel - Excel VBA从表格范围创建唯一列表后删除空白行
- ruby-on-rails - Google Calendar Api:将通知电子邮件添加到活动时如何向与会者发送通知?
- python - 在 TestCase 执行期间 django.db.connection.cursor() SQL 查询从主数据库返回数据,而不是从测试数据库返回数据
- javascript - 如何访问多维数组的内容?
- here-api - 来自 HERE 自动建议端点的意外响应数据
- apache - .htaccess 复杂的重写规则部分工作
- javascript - 渲染 JSX.Element 数组或 HTMLElement React Typescript
- caching - 如何缓存天气预报数据?