2016-05-02 2 views
0

Я хочу создать сгруппированный график, сохраняя при этом порядок. Если это был один столбец, а не сгруппированный график, использование функции переупорядочения очевидно. Но не уверен, как использовать его на расплавленном data.frame.ggplot2: создать упорядоченный групповой график - (изменить порядок)

Здесь подробно объяснение с примерами кода:

Допустим, мы имеем следующие data.frame:

d.nfl <- data.frame(Team1=c("Vikings", "Chicago", "GreenBay", "Detroit"), Win=c(20, 13, 9, 12)) 

черчения простой бар участок, а листать ее.

ggplot(d.nfl, aes(x = Team1, y=Win)) + geom_bar(aes(fill=Team1), stat="identity") + coord_flip() 

выше сюжета не будет иметь порядок, и если я хочу заказать заговор победы, я могу сделать следующее:

d.nfl$orderedTeam <- reorder(d.nfl$Team1, d.nfl$Win) 
ggplot(d.nfl, aes(x = orderedTeam, y=Win)) + geom_bar(aes(fill=orderedTeam), stat="identity") + coord_flip() 

Теперь давайте говорить мы добавим еще один столбец (для исходного кадра данных)

d.nfl$points <- c(12, 3, 45, 5) 

    Team1 Win points 
1 Vikings 20  12 
2 Chicago 13  3 
3 GreenBay 9  45 
4 Detroit 12  5 

генерировать сгруппированный бар участок, сначала нужно расплавить:

library(reshape2) 
> d.nfl.melt <- melt(d.nfl[,c('Team1','Win','points')],id.vars = 1) 
> ggplot(d.nfl.melt,aes(x = Team1,y = value)) + geom_bar(aes(fill = variable),position = "dodge", stat="identity") + coord_flip() 

enter image description here

над ggplot неупорядочен.

но как я упорядоченная группа бар участок (по возрастанию способ)

+2

Вы заказан уровням факторов в первый раз, и это сработало. Возможно, попробуйте установить порядок уровня фактора на растеризованном фрейме данных ...? – joran

+1

Возможный дубликат [Заказать бары в гистограмме ggplot2] (http://stackoverflow.com/questions/5208679/order-bars-in-ggplot2-bar-graph) – alistaire

+0

Что-то связанное [здесь] (http: // stackoverflow. ком/вопросы/1721536/изменение-порядок, из-уклонился-бар-в-ggplot2-barplot). С укладкой вам просто нужно заказать набор данных перед графикой, но это, похоже, не работает для уклонения. – aosmith

ответ

2

Это не проблема.

Самый простой способ, чтобы не отбрасывать Заказанный команду в расплаве:

d.nfl.melt <- melt(d.nfl,id.vars = c("Team1", "orderedTeam")) 

В качестве альтернативы можно использовать reorder после плавления и просто использовать только Win элементы при вычислении упорядоченность:

d.nfl.melt$ordered_after_melting = reorder(
    d.nfl.melt$Team1, 
    X = d.nfl.melt$value * (d.nfl.melt$variable == "Win") 
) 

Еще одна идея - взять levels из исходной упорядоченной колонки и применить их к расплавленному фактору:

d.nfl.melt$copied_levels = factor(
    d.nfl.melt$Team1, 
    levels = levels(d.nfl$orderedTeam) 
) 

Все три метода дают одинаковый результат. (Я оставил координаты, потому что они ничего не добавляют к вопросу, но вы можете, конечно, добавить их обратно.)

gridExtra::grid.arrange(
    ggplot(d.nfl.melt,aes(x = orderedTeam, y = value)) + 
     geom_bar(aes(fill = variable),position = "dodge", stat="identity"), 
    ggplot(d.nfl.melt,aes(x = ordered_after_melting, y = value)) + 
     geom_bar(aes(fill = variable),position = "dodge", stat="identity"), 
    ggplot(d.nfl.melt,aes(x = copied_levels, y = value)) + 
     geom_bar(aes(fill = variable),position = "dodge", stat="identity") 
) 

enter image description here

Как самый простой, я бы рекомендовал просто держать переменную orderedTeam вокруг при плавлении. Ваш код, кажется, упорно работать, чтобы оставить его, это довольно легко держать его.

2

Задача ваш вопрос представляет как реорганизовать фактор Team1 на основе подмножества значений в расплавленном колонке.

Комментарии к вашему вопросу от @alistaire и @joran ссылка на отличные ответы. Ответ tl; dr заключается в том, чтобы просто применить заказ от вашего оригинального, нерасплавленного data.frame к новому, используя levels().

library(reshape2) 
#Picking up from your example code: 
d.nfl.melt <- melt(d.nfl[,c('Team1','Win','points')],id.vars = 1) 
levels(d.nfl.melt$Team1) 
#Current order is alphabetical 
#[1] "Chicago" "Detroit" "GreenBay" "Vikings" 

#Reorder based on Wins (using the same order from your earlier, unmelted data.frame) 
d.nfl.melt$Team1 <- factor(d.nfl.melt$Team1, levels = levels(d.nfl$orderedTeam)) #SOLUTION 
levels(d.nfl.melt$Team1) 
#New order is ascending by wins 
#[1] "GreenBay" "Detroit" "Chicago" "Vikings" 

ggplot(d.nfl.melt,aes(x = Team1,y = value)) + 
    geom_bar(aes(fill = variable),position = "dodge", stat="identity") + coord_flip() 

enter image description here