【问题标题】:How to get a barplot with several variables side by side grouped by a factor如何获得按因子分组的多个变量并排的条形图
【发布时间】:2014-04-13 20:13:45
【问题描述】:

我有一个如下所示的数据集。我正在尝试使用分组变量gender制作条形图,所有变量在x轴上并排(按性别分组为具有不同颜色的填充物),以及y轴上变量的平均值(基本上代表百分比)

tea                coke            beer             water           gender
14.55              26.50793651     22.53968254      40              1
24.92997199        24.50980392     26.05042017      24.50980393     2
23.03732304        30.63063063     25.41827542      20.91377091     1   
225.51781276       24.6064623      24.85501243      50.80645161     1
24.53662842        26.03706973     25.24271845      24.18358341     2   

最后我想得到一个这样的条形图

任何建议如何做到这一点?我进行了一些搜索,但我只找到 x 轴上的因子示例,而不是按因子分组的变量。任何帮助将不胜感激!

【问题讨论】:

  • 你需要更清楚。为了澄清,您希望饮料沿着 x 轴,就像您的示例中的价一样。您想要按性别着色的条形图,例如低和重度抑郁系统,并且条形图的高度由每列按性别的平均值定义,对吗?
  • 嘿crmhaske。我希望颜色代表性别,x 轴将显示饮料的变量,是的! :)
  • 另外,您应该返回并删除您发布的其他问题,询问相同的问题。使用新信息编辑旧问题比发布重复问题更好。

标签: r ggplot2 bar-chart


【解决方案1】:

您可以使用聚合来计算均值:

means<-aggregate(df,by=list(df$gender),mean)
Group.1      tea     coke     beer    water gender
1       1 87.70171 27.24834 24.27099 37.24007      1
2       2 24.73330 25.27344 25.64657 24.34669      2

去掉 Group.1 列

means<-means[,2:length(means)]

然后您将数据重新格式化为长格式:

library(reshape2)
means.long<-melt(means,id.vars="gender")
  gender variable    value
1      1      tea 87.70171
2      2      tea 24.73330
3      1     coke 27.24834
4      2     coke 25.27344
5      1     beer 24.27099
6      2     beer 25.64657
7      1    water 37.24007
8      2    water 24.34669

最后,您可以使用 ggplot2 来创建您的绘图:

library(ggplot2)
ggplot(means.long,aes(x=variable,y=value,fill=factor(gender)))+
  geom_bar(stat="identity",position="dodge")+
  scale_fill_discrete(name="Gender",
                      breaks=c(1, 2),
                      labels=c("Male", "Female"))+
  xlab("Beverage")+ylab("Mean Percentage")

【讨论】:

  • 有没有办法更改代码上的变量名称?还是我应该回去更改数据? ://
  • 我不确定我明白你的意思吗?如果您希望图上的任何标签以不同方式完成,则可以在不修改原始数据文件的情况下完成,但您需要更具体。
  • 巨大的帮助。非常感谢。
  • 假设您只有两个总和列表。如何从头到尾用列声明表结构? - - 这个事实限制了我应用你的方法;我在这里扩展了它stackoverflow.com/q/40554479/54964
  • 如何将 geom_text(aes(x=, y=, label=mylabels) 选项与闪避条一起使用,以使标签居中在每个条上?
【解决方案2】:

您无需借助外部计算和使用stat_summary(...) 的其他表格即可绘制均值。事实上,stat_summary(...) 就是专为您正在做的事情而设计的。

library(ggplot2)
library(reshape2)            # for melt(...)
gg <- melt(df,id="gender")   # df is your original table
ggplot(gg, aes(x=variable, y=value, fill=factor(gender))) + 
  stat_summary(fun.y=mean, geom="bar",position=position_dodge(1)) + 
  scale_color_discrete("Gender")
  stat_summary(fun.ymin=min,fun.ymax=max,geom="errorbar",
               color="grey80",position=position_dodge(1), width=.2)

要添加“误差线”,您还可以使用 stat_summary(...)(这里,我使用的是最小值和最大值而不是 sd,因为您的数据太少了)。

ggplot(gg, aes(x=variable, y=value, fill=factor(gender))) + 
  stat_summary(fun.y=mean, geom="bar",position=position_dodge(1)) + 
  stat_summary(fun.ymin=min,fun.ymax=max,geom="errorbar",
               color="grey40",position=position_dodge(1), width=.2) +
  scale_fill_discrete("Gender")

【讨论】:

  • 如何将 geom_text(aes(x=, y=, label=mylabels) 选项与闪避条一起使用,以使标签居中在每个条上?
【解决方案3】:

使用reshape2dplyr。您的数据:

df <- read.table(text=
"tea                coke            beer             water           gender
14.55              26.50793651     22.53968254      40              1
24.92997199        24.50980392     26.05042017      24.50980393     2
23.03732304        30.63063063     25.41827542      20.91377091     1   
225.51781276       24.6064623      24.85501243      50.80645161     1
24.53662842        26.03706973     25.24271845      24.18358341     2", header=TRUE)

将数据转换成正确的形式:

library(reshape2)
library(dplyr)
df.melt <- melt(df, id="gender")
bar <- group_by(df.melt, variable, gender)%.%summarise(mean=mean(value))

绘图:

library(ggplot2)
ggplot(bar, aes(x=variable, y=mean, fill=factor(gender)))+
  geom_bar(position="dodge", stat="identity")

【讨论】:

  • @Carlos 有没有办法通过将不同的公式添加到变量中来做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多