堆积和排名的条形图

时间:2014-05-29 10:09:39

标签: r plot ggplot2 bar-chart

我有数据:

类似的东西:

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

我想做什么:

在x轴上带有变量“name”的堆积条形图。条形应代表所有可用年份的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]。我使用融合功能将数据从宽格式转换为长格式。

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")

1 个答案:

答案 0 :(得分:2)

您可以使用例如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()

给出: enter image description here