堆积排名条形图

4

我的数据:

类似于这样:

name    year    Var1    Var2    Var3
A   1   0.67    0.97    0.75
A   2   0.19    0.89    0.63
A   3   0.07    0.30    0.95
B   1   0.05    0.66    0.94
B   2   0.43    0.27    0.51
B   3   0.63    0.42    0.13
C   1   0.03    0.26    0.18
C   2   0.70    0.24    0.09
C   3   0.06    0.83    0.03
D   1   0.40    0.16    0.27
D   2   0.10    0.80    0.17
D   3   0.57    0.10    0.78
E   1   0.07    0.66    0.63
E   2   0.00    0.02    0.90
E   3   0.91    0.54    0.17

我想做什么:

一个堆积条形图,其中变量“name”在x轴上。 条形应代表所有可用年份的var1-3的平均值。 最后,X轴应该排名,因此左侧较低的堆积条形图,右侧较高的堆积条形图。

它应该看起来像:

Average Var1    Var2    Var3    Total (var1-3)
    A   0.31    0.72    0.78    1.81
    B   0.37    0.45    0.53    1.35
    C   0.26    0.44    0.10    0.81
    D   0.36    0.35    0.41    1.12
    E   0.33    0.41    0.57    1.30

我所做的事情:

我认为这个任务涉及许多步骤,我已经花了一天半的时间在研究上。

我尝试对数据进行排名,并创建了一个总变量[total = var1+ var2 + var3]。我使用melt函数将数据从宽格式转换为长格式。

longdata <- melt(widedata, id.vars = c("name","year", "total")

尝试对其进行排名:

longdata <- transform(longdata, name = reorder(name, total))

并绘制它(惨败):

ggplot(longdata, aes(x=name, y=longdata$value, fill=factor(variable))) + geom_bar(stat="identity")

两个快速提示:既然您已经告诉ggplot您正在使用longdata,那么您不需要将其重复作为y = value的前缀。第二,您尝试过 ggplot(longdata, aes(x=name, y=reorder(value, total), 等等吗?我没有加载您的数据并运行它,但这可能会按总数递增地放置条形图。 - lawyeR
1个回答

3
您可以使用例如dplyr包来总结您的数据,然后进行重新塑造和绘制:
# reading the data
df <- read.table(text="name    year    Var1    Var2    Var3
A   1   0.67    0.97    0.75
A   2   0.19    0.89    0.63
A   3   0.07    0.30    0.95
B   1   0.05    0.66    0.94
B   2   0.43    0.27    0.51
B   3   0.63    0.42    0.13
C   1   0.03    0.26    0.18
C   2   0.70    0.24    0.09
C   3   0.06    0.83    0.03
D   1   0.40    0.16    0.27
D   2   0.10    0.80    0.17
D   3   0.57    0.10    0.78
E   1   0.07    0.66    0.63
E   2   0.00    0.02    0.90
E   3   0.91    0.54    0.17", header=TRUE)

# creating the 'Total' variable
df$Total <- rowSums(df[,3:5])

# summarising your data
require(dplyr)
newdf <- df %>%
  group_by(name) %>%
  summarise(var1=mean(Var1), var2=mean(Var2), var3=mean(Var3), tot=mean(Total))

# reordering according to 'tot' value
newdf <- transform(newdf, name = reorder(name, tot))

# from wide to long
melted <- melt(newdf, id="name")

# creating the plot
ggplot(melted, aes(x=name, y=value, fill=factor(variable))) + 
  geom_bar(stat="identity") +
  theme_bw()

这将会给出:

enter image description here

你也可以将条状图并排放置(这样你就可以更好地比较它们):

ggplot(melted, aes(x=name, y=value, fill=factor(variable))) + 
  geom_bar(stat="identity", position="dodge") +
  theme_bw()

这将会提供: 在这里输入图片描述

1
+1 很好的回答和图表!顺便说一下,聚合也可以不使用额外的包 aggregate(cbind(Var1, Var2, Var3, Total) ~ name, data = df, mean) - talat
@beginneR 谢谢。我知道aggregate也可以完成这项工作。但是,由于速度快且可以同时组合多个计算,我更喜欢使用dplyr解决方案。 - Jaap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接