2016-05-02 1 views
0

Je souhaite créer un diagramme de barres groupées tout en conservant la commande. S'il s'agissait d'une seule colonne et non d'un graphique à barres groupées, l'utilisation de la fonction de réorganisation est évidente. Mais je ne sais pas comment l'utiliser sur un data.frame fondu.ggplot2: créer un diagramme à barres groupées ordonnées - (utilisation réorganiser)

Voici l'explication en détail l'exemple de code:

Disons que nous avons data.frame suivants:

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

tracer une intrigue simple barre tout en le retournant.

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

ci-dessus parcelle aura pas un ordre et si je veux commander l'intrigue en gagnant je peux faire ce qui suit:

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

Maintenant, supposons que l'on ajoute une autre colonne (à trame de données d'origine)

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 

pour générer terrain bar groupés, nous devons d'abord faire fondre:

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

ci-dessus ggplot n'est pas ordonné.

mais comment je

+2

Vous avez réorganisé les niveaux de facteur la première fois, et cela a fonctionné. Peut-être essayer de définir l'ordre du niveau de facteur sur le cadre de données fondu ...? – joran

+1

Reproduction possible de [Ordre Bars dans le graphique à barres ggplot2] (http://stackoverflow.com/questions/5208679/order-bars-in-ggplot2-bar-graph) – alistaire

+0

Quelque chose de lié [ici] (http: // stackoverflow. com/questions/1721536/changer l'ordre des dodged-bars-in-ggplot2-barplot). Avec l'empilement, il vous suffit de commander l'ensemble de données avant de tracer, mais cela ne semble pas fonctionner pour l'esquive. – aosmith

Répondre

2

Ceci est un non-problème.

La façon la plus simple est de ne pas jeter votre équipe ordonnée dans la masse fondue:

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

Nous pouvons également utiliser reorder après la fusion et il suffit d'utiliser uniquement les Win éléments dans le calcul de la commande:

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

Encore une autre idée est de prendre le levels de la colonne originale ordonnée et les appliquer à un facteur fondu:

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

Les trois méthodes donnent le même résultat. (J'ai omis les coord_flips parce qu'ils n'ajoutent rien à la question, mais vous pouvez bien sûr les rajouter.)

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

Pour ce qui est le plus facile, je recommande juste garder la variable orderedTeam autour tout en faisant fondre. Votre code semble travailler dur pour le laisser de côté, il est assez facile de le garder.

2

Le défi présente votre question commandé terrain barre de groupe (de manière ascendante) est de savoir comment réordonner un facteur Team1 basé sur un sous-ensemble des valeurs dans une colonne fondue.

Les commentaires à votre question de @alistaire et @joran pointent vers de bonnes réponses. La réponse de tl; dr est juste d'appliquer la commande de votre data.Final original, non fondu.à la nouvelle en utilisant 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