首页 文章

堆积和排名的条形图

提问于
浏览
3

我有的数据:

与此类似的东西:

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 回答

  • 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

相关问题