2017-01-25 2 views
0

Wenn dupliziert, bitte zeigen Sie mir die ursprüngliche Frage.ggplot2 zeichnen Grafik in Bezug auf eine bestimmte Reihenfolge

Ich möchte eine Abbildung in R mit ggplot2 zeichnen, und die folgenden Codes zeigen, was ich erreichen möchte.

require(ggplot2) 
require(data.table) 

set.seed(1) 

dat <- data.table(time = rep(c(1:40), times = 5), 
        value = runif(200), 
        team = rep(c("A","B","C","D","E"), each = 40)) 
dat[, value := value/sum(value), by = .(time)] 

ggplot(dat, aes(x = time, y = value, group=team, fill=team)) + 
geom_area(position = "fill") + 
scale_fill_manual(values = c("red","blue","green","pink","yellow"), 
        breaks = c("D", "B", "E", "A", "C"), 
        labels = c("D", "B", "E", "A", "C")) 

ggplot2 Ausgang:

enter image description here

Wie Sie sehen können, ist die Reihenfolge der Figur nicht die Reihenfolge der Legende entsprechen. Es ist die Reihenfolge von A, B, C, D, E, aber nicht D, B, E, A, C. Ich möchte die Figur mit rosa an der Spitze, dann blau, dann gelb, dann rot, dann zeichnen grün (DBEAC). Wie kann ich das erreichen?

Vielen Dank im Voraus!

+0

zu lösen Wenn Sie die scale_manual auslassen, die Aufträge die gleichen sind. –

+0

Oder, wenn die Reihenfolge aus irgendeinem Grund wichtig ist. Ordne die Faktorvariable neu an. Etwas wie 'df $ team <- Faktor (df $ team, levels = c (" D "," B "," E "," A "," C "))'. Dann grafisch darstellen. – lmo

+1

Wenn Sie das Argument "Breaks" für scale_manual weglassen, ist die Reihenfolge auch so, wie Sie es wünschen. Ich kann fast nie sagen, ob solche Anomalien Bugs oder beabsichtigtes Verhalten sind, weil die Hilfeseiten für ggplot2-Funktionen selten genug über die akzeptablen Werte von Parametern oder deren Auswirkungen sagen. –

Antwort

1

Dies ziemlich ein Duplikat ggplot2: Changing the order of stacks on a bar graph ist,

geom_area erscheint die Bereiche in der Reihenfolge, in der sie zum ersten Mal in den Daten zu stapeln erscheinen.

dat in der entsprechenden Reihenfolge Bestellung erscheint Ihr Problem

# create order you want 
my_order <- c("D", "B", "E", "A", "C") 
# reversed to get correct ordering in data table 
dat[, order := match(team, rev(my_order))] 
# sort the data.table 
setorder(dat, time, order) 
# make the plot 
ggplot(dat, aes(x = time, y = value, fill=team))+ 
    geom_area(position = "fill") + 
    scale_fill_manual(values = c("red","blue","green","pink","yellow"), 
        breaks = my_order , 
        labels = my_order) 

enter image description here

+0

Ich glaube, Sie haben Recht, aber auf meiner Maschine, ggplot2 mir immer noch das gleiche Ergebnis. –

Verwandte Themen