Correzione dell'ordine delle sfaccettature in ggplot


97

Dati:

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

Ho bisogno di tracciare un grafico a barre dei dati sopra usando ggplot (asse x -> type, asse y -> amount, gruppo per size). Quando ho utilizzato il codice seguente, non ricevo la variabile typee sizenell'ordine mostrato nei dati. Si prega di vedere la figura. Ho usato il seguente codice per questo.

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

inserisci qui la descrizione dell'immagine .

Per risolvere il problema dell'ordine, ho utilizzato un metodo fattoriale per la variabile "tipo" utilizzando quanto segue. Si prega di vedere anche la figura.

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

inserisci qui la descrizione dell'immagine

Tuttavia, ora non so come correggere l'ordine per la variabile size. Dovrebbe essere 50%, 100%. 150% e 200%.

Risposte:


148

Rendi la tua dimensione un fattore nel tuo dataframe:

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

Quindi cambia facet_grid(.~size)infacet_grid(.~size_f)

Quindi traccia: inserisci qui la descrizione dell'immagine

I grafici sono ora nell'ordine corretto.


7

Ecco una soluzione che mantiene le cose all'interno di una catena di pipe dplyr. Ordinate i dati in anticipo, quindi usate mutate_at per convertirli in un fattore. Ho modificato leggermente i dati per mostrare come questa soluzione può essere applicata in generale, dati i dati che possono essere ordinati in modo ragionevole:

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

Puoi applicare questa soluzione anche per disporre le barre all'interno delle sfaccettature, anche se puoi scegliere solo un singolo ordine preferito:

    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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.