2013-04-26 12 views
15

Qualcuno può spiegare perché questo funziona:Comportamento di facet_grid e scale = "libero" con dati mancanti

d <- data.frame(x = 1:10, y = as.numeric(c(1:4,rep(NA,6))),z=rep(1:5,2)) 
ggplot(data = d, aes(x, y)) + geom_point() +facet_grid(z~.) 

e quando si aggiungono scales="free" a facet_grid viene generato un errore:

d <- data.frame(x = 1:10, y = as.numeric(c(1:4,rep(NA,6))),z=rep(1:5,2)) 
ggplot(data = d, aes(x, y)) + geom_point() +facet_grid(z~.,scales="free") 

# Error in seq.default(from = best$lmin, to = best$lmax, by = best$lstep) : 
# 'from' must be of length 1 

Probabilmente usa il minimo e il massimo di tutte le sfaccettature quando scales non è gratuito. Quando scales è gratuito, non sa quale valore assumere per il facet che contiene solo le missioni?

C'è una soluzione?

+0

Forzare 'y' per essere un fattore di aiuto, ma probabilmente ha anche alcune conseguenze indesiderabili. – joran

+0

In questo esempio forse. Ma il mio asse y è in percentuale. – JT85

+2

In tal caso, dovrei semplicemente eliminare le righe con i valori mancanti dal frame dati stesso e quindi tracciare. – joran

risposta

3

Ho esaminato due soluzioni.

1)

ggplot(data = d, aes(x, y)) + 
    geom_point() + 
    facet_grid(z~.,scales="free_x") 

funziona, ma dà lo stesso risultato senza la parte scales="free".

2)

library(gridExtra) 
p1 <- ggplot(data = d[d$z==1,], aes(x, y)) + geom_point() 
p2 <- ggplot(data = d[d$z==2,], aes(x, y)) + geom_point() 
p3 <- ggplot(data = d[d$z==3,], aes(x, y)) + geom_point() 
p4 <- ggplot(data = d[d$z==4,], aes(x, y)) + geom_point() 
p5 <- ggplot(data = d[d$z==5,], aes(x, y)) + geom_point() 
grid.arrange(p1,p2,p3,p4,p5,ncol=1) 

questo non funziona. Quando si stampano separatamente i grafici, scoprirai che non è possibile tracciare il grafico p5. Ciò è dovuto al fatto che per z=5 ha solo NA.

Provare a utilizzare una scala libera quando ci sono solo NA non è molto logico. A mio parere è un problema concettuale . La ragione di ciò è che senza utilizzare l'argomento scales="free", vengono utilizzate le scale dell'altra sottotrama. Quando si utilizza l'argomento scales="free" (o free_x o free_y), le scale di ciascuna sottotrama verranno impostate in base alla lunghezza della scala. Quando ci sono solo NA, non è possibile determinare la lunghezza della scala che a sua volta causa il messaggio di errore.

Questo è il motivo per cui free_x funziona (anche se fornisce lo stesso risultato).

Per concludere: quando uno dei tuoi gruppi ha solo NA, non è possibile utilizzare scales="free" nella trama. Di conseguenza, si hanno due opzioni (a mio parere):

  • omettendo l'argomento scales="free" per ottenere il vostro sottotrame vuoti desiderati.
  • Sostituzione di NA con 0, ma questa è solo una soluzione quando non si dispone di valori negativi.
+0

Grazie per il vostro impegno, ma non risolve il problema. Non è questione di essere logici o meno. In alcuni casi si potrebbe desiderare di mostrare che un determinato aspetto è vuoto. Inoltre, se si eseguono rapporti standard sui dati che cambiano di volta in volta, un facet vuoto causerà un errore. – JT85

+0

@ JT85 Penso che sia un problema concettuale. Ho aggiornato la mia risposta per spiegarlo. – Jaap

-2

Potremmo risolvere questo problema e la fonte era che stavamo utilizzando il capitale X al posto delle piccole x nella formula, quella sbagliata è: ggplot (isotidy, aes (X = sito, y = dN_fish , riempimento = sito)) + geom_boxplot() e si suppone di essere come di seguito: ggplot (isotidy, aes (x = sito, y = dN_fish, riempire = sito)) + geom_boxplot()

Spero che questo help

0

è anche possibile utilizzare na.omit (dataframe). Questo ha funzionato per me. Ho avuto solo uno (!) NA in 722K righe di dati. E 'stato abbastanza per ottenere questo errore.

Problemi correlati