2017-09-16 3 views
1

J'utilise un diagramme à barres superposées pour afficher la dominance relative des espèces.Comment modifier un graphique à barres empilées recto-verso

Le barchart est généré avec le code suivant:

RelDom <- RelDom[order(RelDom[,2]),] # rank by column A 
RelDom 

RelDom %>% 
    gather(LU, RD, -species) -> likert 
likert 

likert %>% 
    filter(LU=="A") %>% 
    arrange(RD) %>% .$species -> ind_order 
ind_order 


likert %>% 
    mutate(species=factor(species, levels=ind_order, ordered=TRUE)) %>% 
    mutate(LU=factor(LU, 
         levels=c("A", "C", "B"), ordered=F, 
         labels=c("A", "C", "B"))) -> lik 
lik 


tiff(file = "RD.tiff", height=10, width=20, units="in", res=300, compression="lzw") 
ggplot() + 
    geom_hline(yintercept=0, lwd=1) + 
    geom_bar(data=lik, width=.75, 
      stat="identity", position="stack", 
      aes(x=species, y=RD, fill=LU)) + 

    annotate("text", x = 2, y=-50, label = "Old", size=8) + 
    annotate("text", x = 2, y=70, label = "New", size=8) + 

    scale_x_discrete(limits = rev(levels(lik$species)),expand=c(0,0)) + 
    scale_fill_manual(values=c("darkgreen", "red","blue"), 
        drop=FALSE) + 
    scale_y_continuous(expand=c(0,0), 
        limits=c(-100, 200), 
        breaks=c(-100,-50,0,50,100), 
        labels=c("100","50","0","50","100")) + 
    coord_flip() + 
    xlab("Species") + 
    ylab("Relative Dominance") + 
    theme_bw() + 
    theme(legend.position = c(0.9, 0.1)) + 
    theme(legend.title = element_blank()) + 
    theme(legend.text = element_text(colour="black", size = 14)) + 
    theme(legend.background = element_rect(fill="white", size=0.5, linetype="solid", colour ="black")) + 
    theme(axis.title.x = element_text(vjust=0.5,face="bold", size=16), 
     axis.text.x = element_text(vjust=4, size=14)) + 
    theme(axis.title.y = element_text(angle=90, vjust=0.70, face="bold", size=18), 
     axis.text.y = element_text(size=14)) + 
    theme(panel.grid.minor=element_blank()) + 
    theme(panel.grid.major.y = element_blank()) + 
    theme(panel.grid=element_blank()) + 
    theme(panel.border = element_rect(size=1, color = "black")) + 
    theme(plot.margin = unit(c(0.2,0.9,0.3,0.2),"lines")) 
dev.off() 

La figure se présente comme suit:

enter image description here

Maintenant, au lieu du bleu et rouge étant empilés horizontalement, je voudrais chaque colonne bleue doit être directement au-dessus d'une colonne rouge respective. Cela devrait être fait de sorte que les deux colonnes bleues et rouges ne soient que la moitié de leur largeur actuelle, de sorte que, combinées, elles correspondent à la largeur de la colonne verte.

De plus, j'ai du mal à faire afficher la légende dans l'ordre vert, bleu et rouge.

Merci d'avance pour tout conseil.

Ce sont les données reproductibles: dput (RelDom):

structure(list(species = structure(c(1L, 8L, 9L, 10L, 11L, 12L, 
13L, 14L, 15L, 2L, 3L, 4L, 5L, 6L, 7L), .Label = c("Sp1", "Sp10", 
"Sp11", "Sp12", "Sp13", "Sp14", "Sp15", "Sp2", "Sp3", "Sp4", 
"Sp5", "Sp6", "Sp7", "Sp8", "Sp9"), class = "factor"), A = c(-73.55, 
-72.42, -35.62, -12.45, -8.89, -7.26, -6.6, -6.42, -6.02, -5.26, 
-4.59, -4.31, -3.53, -3.25, -2), B = c(64.54, 88.06, 39.57, 14.64, 
6.6, 10.55, 3.87, 7.35, 5.09, 1.88, 6.84, 10.34, 2.17, 2.36, 
1.36), C = c(47.35, 78.55, 39.35, 21.96, 6.25, 7.64, 3.28, 8.94, 
3, 6.04, 5.16, 3.63, 5.42, 12.34, 5.03)), .Names = c("species", 
"A", "B", "C"), row.names = c(NA, 15L), class = "data.frame") 

Répondre

5

si je comprends bien, vous souhaitez que les barres bleues et vertes pour être côte à côte alors que le vert devrait être sur la même position que maintenant .

Créer deux geom_bar sans A et dodge, et un avec seulement A et stack. Pour l'ordre des couleurs dans la légende, si vous souhaitez que la légende soit A, B, C, changez l'ordre des niveaux dans LU. Je suppose que ce n'est pas ce que vous voulez dire, puisque vous sur l'utilisation de fin de cette ligne:

.... 
mutate(LU=factor(LU, 
         levels=c("A", "C", "B"), ordered=F, 
         labels=c("A", "C", "B"))) -> lik 

donc je suppose que vous voulez C être blue et B, red changer juste la ligne color_fill_manual: scale_fill_manual(values=c("darkgreen", "blue", "red")

library(ggplot2) 
ggplot() + 
    geom_bar(data=lik[lik$LU!="A",], width=.75, 
      stat="identity", position="dodge", 
      aes(x=species, y=RD, fill=LU)) + 
    geom_bar(data=lik[lik$LU=="A",], width=.75, 
      stat="identity", position="stack", 
      aes(x=species, y=RD, fill=LU)) + 
    geom_hline(yintercept=0, lwd=1) + 
    annotate("text", x = 2, y=-50, label = "Old", size=8) + 
    annotate("text", x = 2, y=70, label = "New", size=8) + 

    scale_x_discrete(limits = rev(levels(lik$species)),expand=c(0,0)) + 
    scale_fill_manual(values=c("darkgreen", "blue", "red"), 
        drop=FALSE) + 
    scale_y_continuous(expand=c(0,0), 
        limits=c(-100, 200), 
        breaks=c(-100,-50,0,50,100), 
        labels=c("100","50","0","50","100")) + 
    coord_flip() + 
    xlab("Species") + 
    ylab("Relative Dominance") + 
    theme_bw() + 
    theme(legend.position = c(0.9, 0.1)) + 
    theme(legend.title = element_blank()) + 
    theme(legend.text = element_text(colour="black", size = 14)) + 
    theme(legend.background = element_rect(fill="white", size=0.5, linetype="solid", colour ="black")) + 
    theme(axis.title.x = element_text(vjust=0.5,face="bold", size=16), 
     axis.text.x = element_text(vjust=4, size=14)) + 
    theme(axis.title.y = element_text(angle=90, vjust=0.70, face="bold", size=18), 
     axis.text.y = element_text(size=14)) + 
    theme(panel.grid.minor=element_blank()) + 
    theme(panel.grid.major.y = element_blank()) + 
    theme(panel.grid=element_blank()) + 
    theme(panel.border = element_rect(size=1, color = "black")) + 
    theme(plot.margin = unit(c(0.2,0.9,0.3,0.2),"lines")) 

enter image description here

+0

Très bien, merci, c'est exactement ce que j'espérais. En ce qui concerne la légende, si je change l'ordre dans la fonction 'mutate()' ou dans la ligne 'color_fill_manual', les données et les couleurs respectives deviennent confuses. Serait-ce parce que R classe alphabétiquement les étiquettes de colonnes par défaut (je dirais que mes en-têtes de colonnes sont A = OG, B = LIL, C = HIL, j'ai utilisé A, B, C pour le rendre plus facile, mais bien sûr cela supprime la question de l'ordre alphabétique potentiel). – tabtimm

+0

Heureux que c'était utile. Avez-vous essayé: '... scale_fill_manual (valeurs = c (" OG "=" darkgreen "," HIL "=" bleu "," LIL "=" rouge "))' – missuse

+0

Merci, cela fonctionne. Cependant, alors que j'obtiens la bonne combinaison, c'est-à-dire HIL = bleu et LIL = rouge, l'ordre est OG, HIL, LIL plutôt que OG, LIL, HIL qui me ramène au problème que lorsque je change l'ordre des niveaux dans le mute(), c'est-à-dire niveaux = c ("OG", "LIL", "HIL"), les couleurs et les données sous-jacentes ne correspondent plus (alors que l'ordre des légendes est correct). Je me demande si je pourrais changer quelque chose dans le fichier .csv original, à savoir utiliser A, B, C au lieu de OG, LIL, HIL, puis renommer OG, LIL, HIL dans R, pour éviter le problème de l'ordre alphabétique? – tabtimm