2017-10-20 3 views
1

Die documentation für Balkendiagramme in ggplot2 sagt (siehe Beispiel 3):Order of gestapelte Balken ggplot2 - Bodenprofil

Balkendiagramme automatisch gestapelt werden, wenn mehrere Balken an der gleichen Stelle angeordnet sind. Die Reihenfolge der Füllung entspricht der Legende.

Aus irgendeinem Grund funktioniert der zweite Satz nicht für mich. Hier ist ein Beispiel-Datensatz, die Bodenschichten oberhalb (Streu etc.) darstellt und unter der Erde (tatsächlicher Boden):

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

Jetzt versuche ich, die Daten zu zeichnen, indem man zuerst die Reihenfolge der Erdschicht Ebenen Angabe (dh Horizont, von oben nach unten Boden):

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

Es funktioniert für L, F, H aber nicht für A, B (unten gr (d. h. negative Werte). Der Grund, warum es wahrscheinlich nicht funktioniert, ist, dass die gestapelten Balken von site (für positive und negative Werte getrennt) vom größten zum kleinsten sortiert und dann in einem Ansatz von oben nach unten gestapelt werden. Ist das richtig? Wenn das der Fall ist, dann war es für meine positiven Werte ein Zufall, dass die Legende zu den gestapelten Balken passte, die ich glaube.

Was ich erreichen möchte, ist eine Stapelung der Stäbe, die der Reihenfolge (von oben nach unten) in der Legende entspricht und somit auch das Bodenprofil, wenn man es im Querschnitt betrachtet und ich weiß nicht wie sich diesem zu nähern.

Ich habe versucht das Sortierverhalten im Allgemeinen zu ändern, aber es erzeugt die gleiche Handlung wie oben:

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

ich wahrscheinlich separat positive und negative Werte sortieren müssen, dass und aufsteigend absteigt bzw.?

+0

Was die erwartet wird, o Ausgabe? Entspricht das 'levels' Argument in' factor' der erwarteten Ausgabe? –

+0

@AdamQuek Ja, der Pegel 'Argument' im' Faktor' soll der erwarteten Ausgabe entsprechen. – Stefan

Antwort

2

in gestapelter Balkendiagramm Sortierung erfolgt nach Niveaus des entsprechenden Faktor. Das potentielle Problem tritt bei negativen Werten auf, die umgekehrt gestapelt sind (von der negativen Spitze zu 0). Um Problem veranschaulichen kann alle Werte negativ machen:

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

Eine Abhilfe ist eine andere Reihenfolge der Ebenen zu spezifizieren, die in der gewünschten Füllung Ordnung führen werden (in diesem Fall: levels = c("L","F","H","B","A")) und manuell stellen Sie die Legende mit 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

Ja, das habe ich schon beim Stapelverhalten vermutet. Da diese Böden in einer bestimmten Reihenfolge pro Definition kommen, kann ich sie nicht wechseln, d. H. Horizont A kommt vor Horizont B, wenn ein Bodenprofil gegraben wird. Also ist A näher an der Oberfläche und kommt dann B. Macht das Sinn? – Stefan

+0

Was ich erreichen möchte, ist ein Stapeln der Stäbe auf die gleiche Weise wie meine Legende: L, F, H, A, B. Also ist die Reihenfolge der Legende in meinem Plot korrekt, aber ich möchte die Stapelung reflektieren das auch. Momentan macht es nur für L, F, H und es wechselte für A, B. Ich hoffe, ich mache die Dinge nicht zu kompliziert. – Stefan

+0

Ja das ist es !! Vielleicht, wenn du ein oder zwei Sätze schreiben könntest, die erklären, was los ist und warum, wäre das großartig! – Stefan

Verwandte Themen