2014-06-09 14 views
11

Ho iniziato ad apprezzare le trame di violino, dal momento che mi danno una sensazione molto migliore di quella trama quando si hanno distribuzioni divertenti. Mi piace automatizzare un sacco di cose, e quindi ho riscontrato un problema: Quando una variabile ha 0 varianza, il grafico a scatole ti dà solo una linea in quel punto. Geom_violin tuttavia termina con un errore. Quale comportamento mi piacerebbe? Beh, o metti una riga o niente, ma per favore dammi le distribuzioni per le altre variabili.ggplot2 geom_violin con 0 varianza

Ok, rapido esempio:

dff=data.frame(x=factor(rep(1:2,each=100)),y=c(rnorm(100),rep(0,100))) 
ggplot(dff,aes(x=x,y=y)) + geom_violin() 

cede

Error in `$<-.data.frame`(`*tmp*`, "n", value = 100L) : 
    replacement has 1 row, data has 0 

Tuttavia, ciò che funziona è:

ggplot(dff,aes(x=x,y=y)) + geom_boxplot() 

Aggiornamento:

Il problema è stato risolto a partire da ieri: https://github.com/hadley/ggplot2/issues/972

Update 2: (da domanda autore) Wow, Hadley si è risposto! geom_violin ora si comporta in modo coerente con geom_density e base R density.

Tuttavia, non penso che il comportamento sia ancora ottimale.

(1) Il problema e 'zero'

basta eseguirlo con il mio esempio originale:

dff=data.frame(x=factor(rep(1:2, each=100)), y=c(rnorm(100), rep(0,100))) 
ggplot(dff,aes(x=x,y=y)) + geom_violin(trim=FALSE) 

Cedendo questo: enter image description here

è la trama sulla destra un adeguato rappresentazione di "tutti gli zeri"? Io non la penso così È meglio avere un taglio che produce una singola riga per mostrare che non c'è variazione nei dati. Soluzione alternativa: aggiungere un + geom_boxplot()

(2) Potrei volere davvero TRIM=TRUE.

Esempio:

dff=data.frame(x=factor(rep(1:2, each=100)), y=c(rgamma(100,1,1), rep(0,100) )) 
ggplot(dff,aes(x=x,y=y)) + geom_violin(trim=FALSE) 

ora ho diverso da zero dati e stime di densità standard del kernel non gestire questa situazione in modo corretto. Con trim=T posso vedere rapidamente che i dati sono strettamente positivi.

Non sto sostenendo che il comportamento corrente sia "sbagliato", poiché è in linea con altre funzioni. Tuttavia, geom_violin può essere utilizzato in diversi contesti, per esplorare diversi data.frames con tipi di dati eterogenei (positivo + disallineato o meno, ad esempio).

+0

Sembra una cosa ragionevole da presentare come un problema su github, specialmente dal momento che la gestione di questo caso è probabilmente piuttosto semplice (anche se potrebbero esserci forti sensazioni su cosa visualizzare). – joran

+1

Come attacco rapido, puoi impostare uno dei valori y su 0,0001 (anziché zero) e 'geom_violin' funzionerà. Puoi anche controllare il pacchetto 'vioplot' se non hai impostato l'uso di' ggplot2'. 'vioplot' non genera un errore quando lo si alimenta con un gruppo di valori identici. – eipi10

+0

Proprio come un'altra potenziale opzione, il pacchetto 'Hmisc' include una funzione' panel.bbplot' (box-percentile plot) che può creare grafici di violini con la funzione 'bwplot' da' lattice'. Vedi la sezione Esempi di '? Panel.bpplot'. Produce una singola riga quando la si alimenta con un vettore di valori identici. – eipi10

risposta

3

Tre opzioni per affrontare questo fino a quando il problema è stato risolto ggplot2:

  1. Come un rapido hack, è possibile impostare uno dei valori y 0.0001 (anziché zero) e geom_violin funzionerà.
  2. Controllare il pacchetto vioplot se non si è impostato sull'uso di ggplot2. vioplot non genera un errore quando lo si alimenta con un gruppo di valori identici.
  3. Il pacchetto Hmisc include una funzione panel.bpplot (campo percentuale-percento) che può creare grafici di violino con la funzione bwplot dal pacchetto lattice. Vedere la sezione Esempi di ?panel.bpplot. Produce una singola riga quando la si alimenta con un vettore di valori identici.
+1

Quando si utilizza l'opzione 1, anche tutti gli altri violinplot (con varianza> 0) si deformano - con un approccio di subsetting è possibile una soluzione: http://stackoverflow.com/a/25083853/1498405 – hardmooth