Festlegen der Reihenfolge der Facetten in ggplot

93

Daten:

df <- data.frame(
    type   = c("T", "F", "P", "T", "F", "P", "T", "F", "P", "T", "F", "P"), 
    size   = c("50%", "50%", "50%", "100%", "100%", "100%", "150%", "150%", "150%", "200%", "200%", "200%"),
    amount = c(48.4, 48.1, 46.8, 25.9, 26, 24.9, 21.1, 21.4, 20.1, 20.8, 21.5, 16.5)
)

Ich muss ein Balkendiagramm der obigen Daten mit ggplot (x-Achse -> type, y-Achse -> amount, gruppieren nach size) zeichnen . Wenn ich den folgenden Code verwendet habe, erhalte ich die Variable nicht typeund auch nicht sizein der in den Daten angegebenen Reihenfolge. Bitte sehen Sie die Abbildung. Ich habe den folgenden Code dafür verwendet.

 ggplot(df, aes(type, amount , fill=type, group=type, shape=type, facets=size)) + 
  geom_bar(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(.~size) + 
  theme_bw() + 
  scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"), 
                    labels = c("T", "F", "P"))

Geben Sie hier die Bildbeschreibung ein .

Zur Behebung des Auftragsproblems habe ich eine Faktormethode für die Variable "Typ" verwendet, die Folgendes verwendet. Bitte beachten Sie auch die Abbildung.

temp$new = factor(temp$type, levels=c("T","F","P"), labels=c("T","F","P")) 

Geben Sie hier die Bildbeschreibung ein

Jetzt weiß ich jedoch nicht, wie ich die Reihenfolge für die Variable festlegen soll size. Es sollte 50%, 100% sein. 150% und 200%.

Samarasa
quelle

Antworten:

140

Machen Sie Ihre Größe zu einem Faktor in Ihrem Datenrahmen, indem Sie:

temp$size_f = factor(temp$size, levels=c('50%','100%','150%','200%'))

Dann ändern Sie die facet_grid(.~size)zufacet_grid(.~size_f)

Dann Handlung: Geben Sie hier die Bildbeschreibung ein

Die Grafiken sind jetzt in der richtigen Reihenfolge.

Harpal
quelle
7

Hier ist eine Lösung, die Dinge innerhalb einer dplyr-Rohrkette hält. Sie sortieren die Daten im Voraus und konvertieren sie dann mit mutate_at in einen Faktor. Ich habe die Daten geringfügig geändert, um zu zeigen, wie diese Lösung im Allgemeinen angewendet werden kann, wenn Daten sinnvoll sortiert werden können:

# the data
temp <- data.frame(type=rep(c("T", "F", "P"), 4),
                    size=rep(c("50%", "100%", "200%", "150%"), each=3), # cannot sort this
                    size_num = rep(c(.5, 1, 2, 1.5), each=3), # can sort this
                    amount=c(48.4, 48.1, 46.8, 
                             25.9, 26.0, 24.9,
                             20.8, 21.5, 16.5,
                             21.1, 21.4, 20.1))

temp %>% 
  arrange(size_num) %>% # sort
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>% # convert to factor

  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)

Sie können diese Lösung auch anwenden, um die Balken innerhalb von Facetten anzuordnen. Sie können jedoch nur eine einzige bevorzugte Reihenfolge auswählen:

    temp %>% 
  arrange(size_num) %>%
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>%
  arrange(desc(amount)) %>%
  mutate_at(vars(type), funs(factor(., levels=unique(.)))) %>%
  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)


  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)
tim.farkas
quelle