R叠加百分比条形图,带ggplot的双因素变量百分比

R叠加百分比条形图,带ggplot的双因素变量百分比,r,ggplot2,label,bar-chart,geom-bar,R,Ggplot2,Label,Bar Chart,Geom Bar,我试图绘制两个因子变量,并在图中用%标记结果 我已经检查了这篇文章和他/她提供的链接: 您在这里看到的ggplot线实际上来自推荐的帖子之一: sex <- c("F","F","M", "M", "M", "F","M","F","F", "M", "M", "M", "M","F","F", "M", "M", "F") behavior <- c("A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "

我试图绘制两个因子变量,并在图中用%标记结果

我已经检查了这篇文章和他/她提供的链接:

您在这里看到的ggplot线实际上来自推荐的帖子之一:

sex <- c("F","F","M", "M", "M", "F","M","F","F", "M", "M", "M", "M","F","F", "M", "M", "F")
behavior <- c("A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C", "B", "C", "A")

BehSex <- data.frame(sex, behavior)

ggplot(BehSex, aes(x= factor(sex), fill= factor(behavior), y = (..count..)/sum(..count..)))+
  geom_bar() +
  stat_bin(geom = "text",
          aes(label = paste(round((..count..)/sum(..count..)*100), "%")),
          vjust = 5)
但是,当我使用该行时,会出现以下错误:

错误:StatBin需要一个连续的x变量:x变量为 离散的也许你想要stat=count

我试着在geom_栏中使用stat=count,但似乎没有达到预期效果

三个问题: 我做错了什么? 2我怎样才能规划出我想要的东西? 3如何绘制:百分比,然后在另一个图形中绘制计数

这是我现在掌握的情节


提前感谢您的帮助

我认为将y轴标签格式化为百分比的更简单方法是使用scale\u y\u continuouslabels=scales::percent,而不是使用stat\u bin。。。。因此,代码几乎可以保持不变

ggplot(BehSex, aes(x= factor(sex), fill= factor(behavior), y =(..count..)/sum(..count..)))+
  geom_bar() +
  #Set the y axis format as percentage
  scale_y_continuous(labels = scales::percent)+
  #Change the legend and axes names 
  labs(x = "Sex", y = "Percentage",fill = "Behavior")

我认为将y轴标签格式化为百分比的一种更简单的方法是使用scale\u y\u continuouslabels=scales::percent,而不是使用stat\u bin。。。。因此,代码几乎可以保持不变

ggplot(BehSex, aes(x= factor(sex), fill= factor(behavior), y =(..count..)/sum(..count..)))+
  geom_bar() +
  #Set the y axis format as percentage
  scale_y_continuous(labels = scales::percent)+
  #Change the legend and axes names 
  labs(x = "Sex", y = "Percentage",fill = "Behavior")

关于你提到的帖子的答案,你必须使用position=position\u堆栈显示百分比

此外,您还可以使用dplyr包从数据帧中获取百分比。我认为,这样更容易显示标签:

图书馆弹琴 df%group\U BYEX%>%countbehavior%>%mutatePercent=n/sumn*100 一个tibble:6x4 组别:性别[2] 性行为百分之n 1楼A 2 25 2 F B 3 37.5 3 F C 3 37.5 4米A 4 40 5米B 330 6米C30 然后,你可以得到这样的图:

ggplotdf,aesx=性别,y=百分比,填充=行为+ geom_barstat=标识+ geom_textaeslabel=粘贴百分比,%,y=百分比, 位置=位置=0.5+ 坐标翻转+ labsx=性别,y=百分比,fill=行为
关于你提到的帖子的答案,你必须使用position=position\u堆栈显示百分比

此外,您还可以使用dplyr包从数据帧中获取百分比。我认为,这样更容易显示标签:

图书馆弹琴 df%group\U BYEX%>%countbehavior%>%mutatePercent=n/sumn*100 一个tibble:6x4 组别:性别[2] 性行为百分之n 1楼A 2 25 2 F B 3 37.5 3 F C 3 37.5 4米A 4 40 5米B 330 6米C30 然后,你可以得到这样的图:

ggplotdf,aesx=性别,y=百分比,填充=行为+ geom_barstat=标识+ geom_textaeslabel=粘贴百分比,%,y=百分比, 位置=位置=0.5+ 坐标翻转+ labsx=性别,y=百分比,fill=行为
下面是另一种使用dplyr进行数据准备的方法:

编辑:添加计数。要显示其中一个,只需更改标签即可

library(dplyr)
BehSexSum <- BehSex %>%
  count(sex, behavior) %>%
  mutate(pct = n / sum(n),
         pct_label = scales::percent(pct))

ggplot(BehSexSum, aes(x= sex, fill = behavior, y = pct)) +
  geom_col() +
  geom_text(aes(label = paste(pct_label, n, sep = "\n")), 
                lineheight = 0.8,
                position = position_stack(vjust = 0.5)) +
  scale_y_continuous(labels = scales::percent)

下面是另一种使用dplyr进行数据准备的方法:

编辑:添加计数。要显示其中一个,只需更改标签即可

library(dplyr)
BehSexSum <- BehSex %>%
  count(sex, behavior) %>%
  mutate(pct = n / sum(n),
         pct_label = scales::percent(pct))

ggplot(BehSexSum, aes(x= sex, fill = behavior, y = pct)) +
  geom_col() +
  geom_text(aes(label = paste(pct_label, n, sep = "\n")), 
                lineheight = 0.8,
                position = position_stack(vjust = 0.5)) +
  scale_y_continuous(labels = scales::percent)

谢谢你的回答,乔纳森!但是,如果我错了,请纠正我,但您的答案并不能解决标签问题,即如何在绘图中绘制%标签。也许我对我的问题不够清楚。。。我的错!是的,你说得对。我忘记解决标签的问题了。我想它说得很清楚,但我忘了。我的错!我想@dc37已经解决了这个问题。谢谢你的回答,乔纳森!但是,如果我错了,请纠正我,但您的答案并不能解决标签问题,即如何在绘图中绘制%标签。也许我对我的问题不够清楚。。。我的错!是的,你说得对。我忘记解决标签的问题了。我想它说得很清楚,但我忘了。我的错!我想@dc37已经解决了这个问题。太棒了!!!我已经讲了好几个小时了。非常感谢你!但是,如果我错了,请纠正我,但我认为您提供的代码覆盖了函数df。此外,因为我加载了许多包,所以在调用count之前必须指定dplyr::。对读者来说只是一些精确性。最后,它如预期的那样发挥了作用。当然,如果您的环境中已经有一个名为df的对象,它将被这个新对象替换,但您可以根据自己的需要和使用BehSex2时的做法来命名它。如果在运行代码之前加载库dplyr,R将使用dplyr包中的count函数。@dc37谢谢您的回答。向上投票。请让我知道,如果可能的话,如何在Y轴上切换轴百分比,在x轴上切换性别,因为我使用了
我的数据和x轴的代码是相同的。太棒了!!!我已经讲了好几个小时了。非常感谢你!但是,如果我错了,请纠正我,但我认为您提供的代码覆盖了函数df。此外,因为我加载了许多包,所以在调用count之前必须指定dplyr::。对读者来说只是一些精确性。最后,它如预期的那样发挥了作用。当然,如果您的环境中已经有一个名为df的对象,它将被这个新对象替换,但您可以根据自己的需要和使用BehSex2时的做法来命名它。如果在运行代码之前加载库dplyr,R将使用dplyr包中的count函数。@dc37谢谢您的回答。向上投票。如果可能的话,请告诉我如何在Y轴上切换轴的百分比和在x轴上切换轴的性别,因为我对数据使用了相同的代码,我的x轴是年。非常感谢Jon!!不错的选择!非常感谢你,乔恩!!不错的选择!