按R中的累积值对堆积条形图进行排序

时间:2015-03-07 13:56:01

标签: r ggplot2

我是R的新手,我正试图获得叠加的条形图。我的数据如下:

    name    value1  value2
1   A       1118    239
2   B       647     31
3   C       316     1275
4   D       2064    230
5   E       231     85

我需要一个带有堆叠值的水平条形图,这是我可以通过我有限的R技能得到的(大部分都是复制粘贴):

melted <- melt(data, id.vars=c("name"))

melted$name <- factor(
  melted$name, 
  levels=rev(sort(unique(melted$name))), 
  ordered=TRUE
)

melted2 <- melted[order(melted$value),]

ggplot(melted2, aes(x= name, y = value, fill = variable)) + 
  geom_bar(stat = "identity") +
  coord_flip()

甚至花了我几个小时来达到这一点,女巫我看起来很满意,这就是产生的输出

enter image description here

我现在要做的是按总和值排序条形(D先是,然后是C,A,B,E)。我用谷歌搜索并尝试了一些reorderorder的东西,但我根本无法让它表现得像我想要的那样。我确信解决方案必须非常简单,所以我希望你们可以帮助我。

提前致谢!

3 个答案:

答案 0 :(得分:1)

好吧,我没有关注或跟上ggplot中的所有最新变化,但是这里有一种方法可以解决这个问题

我使用您的想法设置name的因子级别,但是基于分组的总和。您可能还会发现order = variable在某些时候很有用,它会根据变量对条形颜色进行排序,但这里不需要

data <- read.table(header = TRUE, text = "name    value1  value2
1   A       1118    239
2   B       647     31
3   C       316     1275
4   D       2064    230
5   E       231     85")

library('reshape2')
library('ggplot2')

melted <- melt(data, id.vars=c("name"))

melted <- within(melted, {
  name <- factor(name, levels = names(sort(tapply(value, name, sum))))
})

levels(melted$name)
# [1] "E" "B" "A" "C" "D"

ggplot(melted, aes(x= name, y = value, fill = variable, order = variable)) + 
  geom_bar(stat = "identity") +
  coord_flip()

enter image description here

答案 1 :(得分:1)

另一种选择是使用dplyr包在数据框中设置总列并使用它进行排序。 方法看起来像这样。

m <- melted %>% group_by(name) %>% 
     mutate(total = sum(value) ) %>% 
     ungroup() %>%
     arrange(total) %>%
     mutate(name = factor(name, levels = unique(as.character(name))) )

ggplot(m, aes(x = name, y = value, fill = variable)) + geom_bar(stat = 'identity') + coord_flip()

答案 2 :(得分:0)

请注意尝试以下代码。

  • 使用tidyr包代替reshape2

    library(ggplot2)
    library(dplyr)
    library(tidyr)
    
    data <- read.table(text = "
                       class value1 value2
                       A     1118   239
                       B     647    31
                       C     316    1275
                       D     2064   230
                       E     231    85", header = TRUE)
    
        pd <- gather(data, key, value, -class) %>% 
          mutate(class = factor(class, levels = tapply(value, class, sum) %>% sort %>% names))
    
        pd %>% ggplot(aes(x = class, y = value, fill = key, order = class)) + 
          geom_bar(stat = "identity") +
      coord_flip()