2015-03-07 1 views
0

Я довольно новичок в R, и я пытаюсь получить штабелированный участок. Мой данные выглядит следующим образом:Сортировка уложенного барного графика по совокупному значению в 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

W Теперь я хочу сделать, чтобы бары упорядочивались суммированным значением (сначала D, затем C, A, B, E). Я googled и пробовал некоторые reorder и order вещи, но я просто не могу заставить его вести себя так, как я этого хочу. Я уверен, что решение должно быть довольно простым, поэтому я надеюсь, что вы, ребята, можете мне помочь.

Заранее благодарен!

+0

http://stackoverflow.com/questions/5208679/order-bars-in-ggplot2-bar-graph – rawr

+0

я уже видел эта страница, но, похоже, не может работать в моем собственном коде ... Можете ли вы дать мне подсказку о том, как внедрить мою рутину? Извините, что я такой noob. – Mihael

ответ

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

+0

Это сделало трюк, спасибо !!! Очень обязан! – Mihael

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() 
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() 
    
Смежные вопросы