Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在条形图中添加百分比标签(gglot2)_R_Ggplot2_Label_Bar Chart - Fatal编程技术网

R 在条形图中添加百分比标签(gglot2)

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

我有以下数据集,其中包含以下变量,指示某人是否使用了手机(一个虚拟变量,其中1=使用了手机(“是”),0(“否”);他们的身份证以及居住的地区和街道。请注意,同一个人可能在不同的分区下记录了两次或两次以上。但是,我只想对这样一个人进行计数,也就是说,只考虑唯一的IDS。< /P>
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)))
  
这段代码运行良好。但是,我想做两件事:

  • 在各个条上为每组添加%标签(是和否),但y轴显示“计数”
  • 绘制图形,使其仅考虑唯一ID
  • 期待着在你的帮助下解决这个问题,因为我是R的新手

    谢谢,
    拉希塔这里有一个可行的建议:

  • 根据
    使用过的手机
    总结您的df,并统计使用过手机和未使用过手机的总人数
  • 根据汇总的计数,您可以计算百分比份额,并以此添加
    label
    cloumn,即带有
    %
    符号的百分比份额
  • 您可以使用ggplot和新的汇总
    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), '%'))