2017-10-20 20 views
1

Le documentation pour les graphiques à barres dans ggplot2 Says (voir exemple 3):Ordre des barres empilées ggplot2 - Profil du sol

graphiques à barres sont automatiquement empilés lorsque plusieurs barres sont placées au même endroit. L'ordre du remplissage est conçu pour correspondre à la légende.

Pour une raison quelconque, la deuxième phrase ne fonctionne pas pour moi. Voici un exemple d'ensemble de données, ce qui représente des couches de sol au-dessus (feuilles mortes, etc.) et en sous-sol (sol réel):

df <- structure(list(horizon = structure(c(5L, 3L, 4L, 2L, 1L, 5L, 
3L, 4L, 2L, 1L, 5L, 3L, 4L, 2L, 1L, 5L, 3L, 4L, 2L, 1L, 5L, 3L, 
4L, 2L, 1L, 5L, 3L, 4L, 2L, 1L), .Label = c("A", "B", "F", "H", 
"L"), class = "factor"), site = structure(c(1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L), .Label = c("A", "B", "C", 
"D", "E", "F"), class = "factor"), value = c(2.75, 0.5, 0.25, 
-4.125, -3.375, 3.78125, 1.375, 0.625, -10.6875, -6.34375, 4.28, 
2.065, 0.68, -12.1, -10.75, 8.583333333, 4.541666667, 2.166666667, 
-10.70833333, -4.25, 7.35, 4, 1.8, -13.95, -5.175, 1.933333333, 
1.245833333, 0.641666667, -11.16666667, -2.291666667)), .Names = c("horizon", 
"site", "value"), class = "data.frame", row.names = c(NA, -30L 
)) 

Maintenant, j'essaie de tracer les données en spécifiant tout d'abord l'ordre des niveaux de la couche de sol (c.-à-horizons, de haut en bas sol):

require(ggplot2); require(dplyr) 
df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","A","B"))) %>% 
    ggplot(aes(site, value)) + geom_col(aes(fill = horizon)) + labs(y = "Soil depth (cm)") 

enter image description here

Il travaille pour L, F, H mais pas pour A, B (ci-dessous gr ound, c'est-à-dire des valeurs négatives). La raison pour laquelle cela ne fonctionne probablement pas est que les barres empilées sont triées du plus grand au plus petit par site (pour les valeurs positives et négatives séparément) et ensuite empilées dans une approche de haut en bas. Est-ce correct? Si c'est le cas, alors pour mes valeurs positives c'était juste une coïncidence que la légende correspondait aux barres empilées je crois. Ce que je voudrais accomplir est un empilement des barres qui correspond à l'ordre (de haut en bas) dans la légende et donc aussi le profil de sol en le regardant dans une vue en coupe transversale et je ne suis pas sûr comment pour aborder cela.

J'ai essayé de changer le comportement de tri en général, mais il produit la même parcelle que ci-dessus:

df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","A","B"))) %>% 
    arrange(desc(value)) %>% 
    ggplot(aes(site, value)) + geom_col(aes(fill=horizon)) + labs(y = "Soil depth (cm)") 

df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","A","B"))) %>% 
    arrange(value) %>% 
    ggplot(aes(site, value)) + geom_col(aes(fill=horizon)) + labs(y = "Soil depth (cm)") 

J'ai probablement pour trier des valeurs positives et négatives séparément, ce qui est descendant et ascendant, respectivement?

+0

Quelle est l'attend o utput? Est-ce que votre argument 'levels' dans' factor' correspond à la sortie attendue? –

+0

@AdamQuek Oui, les niveaux 'argument' dans le' factor' est censé correspondre à la sortie attendue. – Stefan

Répondre

2

Le tri dans un diagramme à barres empilées est effectué en fonction des niveaux du facteur correspondant. Le problème potentiel se pose avec des valeurs négatives qui sont empilées en inverse (du sommet négatif vers 0). Pour illustrer à un problème permet de faire toutes les valeurs négatives:

df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","B","A"))) %>% 
    ggplot(aes(site, value - 20)) + geom_col(aes(fill = horizon)) + labs(y = "Soil depth (cm)") 

enter image description here

Une solution de contournement est de spécifier un ordre différent de niveaux qui se traduira par l'ordre désiré de remplissage (dans ce cas: levels = c("L","F","H","B","A")) et manuellement ajuster la légende à l'aide scale_fill_discrete:

df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","B","A"))) %>% 
    ggplot(aes(site, value)) + geom_col(aes(fill = horizon)) + labs(y = "Soil depth (cm)")+ 
    scale_fill_discrete(breaks = c("L","F","H","A","B")) 

enter image description here

+0

Oui c'est ce que j'ai déjà deviné concernant le comportement d'empilement. Puisque ces horizons de sols sont dans un ordre spécifique par définition, je ne peux pas les changer, c'est-à-dire que l'horizon A vient avant l'horizon B quand je creuse un profil de sol. Alors A est plus proche de la surface et vient ensuite B. Est-ce que cela a du sens? – Stefan

+0

Ce que je voudrais réaliser est un empilement des barres de la même manière que ma légende: L, F, H, A, B. Donc l'ordre de la légende dans mon intrigue est correct mais je voudrais que l'empilement reflète ça aussi. Actuellement, il ne le fait que pour L, F, H et il a changé pour A, B. J'espère que je ne rends pas les choses trop compliquées. – Stefan

+0

Ouais c'est tout !! Peut-être que si vous pouviez écrire une phrase ou deux expliquant ce qui se passait et pourquoi, ce serait génial! – Stefan