R 在条形图中添加百分比标签(gglot2)
我有以下数据集,其中包含以下变量,指示某人是否使用了手机(一个虚拟变量,其中1=使用了手机(“是”),0(“否”);他们的身份证以及居住的地区和街道。请注意,同一个人可能在不同的分区下记录了两次或两次以上。但是,我只想对这样一个人进行计数,也就是说,只考虑唯一的IDS。< /P>R 在条形图中添加百分比标签(gglot2),r,ggplot2,label,bar-chart,R,Ggplot2,Label,Bar Chart,我有以下数据集,其中包含以下变量,指示某人是否使用了手机(一个虚拟变量,其中1=使用了手机(“是”),0(“否”);他们的身份证以及居住的地区和街道。请注意,同一个人可能在不同的分区下记录了两次或两次以上。但是,我只想对这样一个人进行计数,也就是说,只考虑唯一的IDS。< /P> district sub_district id used_phone A SX 1 Yes A SX 2 Yes A SX 3 No A SX
district sub_district id used_phone
A SX 1 Yes
A SX 2 Yes
A SX 3 No
A SX 4 No
A SY 4 No
A SY 5 Yes
A SZ 6 Yes
A SX 6 Yes
A SZ 7 No
B RX 8 No
B RV 9 No
B RX 9 No
B RV 10 Yes
B RV 11 Yes
B RT 12 Yes
B RT 13 Yes
B RV 13 Yes
B RT 14 No
B RX 14 No
注意:二手电话是一个因素变量
对于上面的数据集,我想绘制“某人是否使用电话”的分布,我使用了以下代码:
ggplot(df, aes(x=used_phone)) +
geom_bar(color = "black", fill = "aquamarine4", position = "dodge") +
labs(x="Used phone", y = "Number of people") +
ggtitle("Whether person used phone") +
theme_bw() +
theme(plot.title = element_text(hjust = 0.5)))
这段代码运行良好。但是,我想做两件事:
拉希塔这里有一个可行的建议:
使用过的手机
总结您的df,并统计使用过手机和未使用过手机的总人数label
cloumn,即带有%
符号的百分比份额df
进行打印。您可以使用geom_text()
在条的顶部添加百分比标签,使用position_stack()
中的vjust
参数来调整标签的位置df%>%
不同(.keep_all=T)%>%
分组人(使用过的电话)%>%
汇总(n())%>%
设置名称(,c('used_phone','count'))%>%
突变(‘份额’=计数/总和(计数),
'label'=paste0(圆形(共享*100,2),'%')->df
ggplot(df,aes(y=计数,x=使用的电话))+
几何图形栏(stat='identity',
color=“黑色”,
fill=“aquamarine 4”,
position=“道奇”)+
几何图形文本(aes(标签=标签),
位置=位置\u堆栈(vjust=1.02),
尺寸=3)+
实验室(标题=‘是否有人使用电话’,
x=‘二手电话’,
y=‘人数’)+
主题_bw()
由于id中的重复项是同时居住在不同sub_区的id,您不想重复计算它们,因此我删除变量
sub_区
。
然后清除所有的重复项,清点电话并计算百分比。显示了由此产生的DF。
ggplot带有geom\u col
,轴上的百分比带有比例
我已经注释掉了两行代码,这两行代码允许您在ggplot中为district刻面。由此得出的图表附在底部
库(tidyverse)
df
#>不,是的
#> 9 10
ddf%
选择(-sub_district)%>%#删除sub_district
不同的(id,.keep_all=T)%>%#唯一的id`s`
#组别(地区)%>%
计数(使用过的手机)%>%\t手机
变异(pct=n/总和(n))#计算百分比
ddf
#>#tibble:2 x 3
#>二手电话
#>
#>1号6 0.429
#>2是8 0.571
ggplot(ddf、aes(二手电话、pct、填充=二手电话))+
几何坐标(位置='dodge')+
#面包(~区域)+
刻度填充手册(数值=c(“Aquamarine 4”、“Aquamarine 3”))+
比例是连续的(标签=比例::百分比格式()
根据评论新增内容:
- 需要y轴计数
- 要将百分比作为条上的标签
- 作为地区的一个方面
ddf%
选择(-sub_district)%>%#删除sub_district
不同的(id,.keep_all=T)%>%#唯一的id`s`
组别(地区)%>%
计数(使用过的手机)%>%\t手机
变异(pct=n/总和(n),#计算百分比
标签=0(圆形(pct*100,2),“%”)
ggplot(ddf,aes(使用电话,n,填充=使用电话))+
几何坐标(位置='dodge')+
面包(~区域)+
刻度填充手册(数值=c(“Aquamarine 4”、“Aquamarine 3”))+
几何图形文本(aes(标签=标签),
位置=位置\u堆栈(vjust=1.05),
尺寸=3)+
实验室(y='count')
*新增* 更改百分比的基础
ddf <- df %>%
select(-sub_district) %>% # delete sub_district
distinct(id, .keep_all = T) %>% # unique id`s`
mutate(ssum = n()) %>%
group_by(district) %>%
count(used_phone, ssum) %>% # cout phones
mutate(pct = n / ssum, # calculate percentage
label = paste0(round(pct*100, 2), '%'))
ddf%
选择(-sub_district)%>%#删除sub_district
不同的(id,.keep_all=T)%>%#唯一的id`s`
突变(ssum=n())%>%
组别(地区)%>%
计数(使用过的电话,ssum)%>%\cout电话
变异(pct=n/ssum,#计算百分比
标签=0(圆形(pct*100,2),“%”)
我引入了一个新变量,它在分组之前对数字进行求和。这就产生了:
能否将数据的最小子集作为数据帧对象?可能使用
dput(df)
。这允许对潜在的解决方案进行测试和验证。看看。谢谢你的建议,彼得!我已经更新了数据集。不幸的是,我不能发布原始数据集,因此,为您的审查制作了一个。希望没问题。这能回答你的问题吗?至于唯一的id,请考虑使用类似于df[!duplicated(df$id),]
Hi、@4redwood:上述链接对我的情况没有帮助。不过,谢谢你指出这一点!最初的DF有19行,在used\u phone
中都有yes或no。因此,不可能两者都有50%的准确使用率。@Rachita只想计算唯一的id。我在用新数据更新问题之前创建了这个答案,感谢您指出不同的条件,我修改了代码以包含它。谢谢,两者都是!!该代码工作正常,但条件不同-它仍然根据非唯一ID计算是/否的数量。我试过你的两个版本。有什么办法解决这个问题吗?谢谢,马布洛。但是,我希望y轴为“计数”,而不是%。百分比可以作为条形图上的标签。你能帮我做这件事吗
ddf <- df %>%
select(-sub_district) %>% # delete sub_district
distinct(id, .keep_all = T) %>% # unique id`s`
mutate(ssum = n()) %>%
group_by(district) %>%
count(used_phone, ssum) %>% # cout phones
mutate(pct = n / ssum, # calculate percentage
label = paste0(round(pct*100, 2), '%'))