2012-10-09 12 views
16

Sto provando a usare position_dodge su ggplot per ottenere grafici a scatole di due segnali diversi (ind) che condividono le stesse categorie (cat). Quando esiste una categoria con dati per un segnale ma non per l'altro, il grafico a scatole per il segnale con dati copre tutta la spaziatura orizzontale e non rispetta l'istruzione position_dodge per quella particolare categoria. C'è un modo per fare ggplot per far rispettare la regola di schivare? Come puoi vedere nell'esempio qui sotto, il segnale x non ha dati per la categoria B, quindi perde lo spazio riservato da position_dodge. Vorrei evitarlo.Come imporre il position_dodge di ggplot su categorie senza dati?

Grazie in anticipo.

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
       values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
       ind=c('x','x','x','x','x','x','y','y','y','y','y','y')) 

print(ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(
      aes(x=as.factor(cat), y=values, 
       fill=ind), 
      position=position_dodge(width=.60), 
      data=data, 
      outlier.size = 1.2, 
      na.rm=T)) 

graph with original problem

CORSO AGGIORNAMENTO

Dopo alcune soluzioni, mi si avvicinò con il risultato che cercavo ... (tipo di)

data   <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

p <- ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
     position=position_dodge(width=.60), 
     data=data, 
     outlier.size = 1.2, 
     na.rm=T) + 
     geom_line(aes(x=x, y=y), 
       data=data.frame(x=c(0,3),y=rep(0,2)), 
       size = 1, 
       col='white') 
print(p) 

solution with workaround

Alcune persone consigliavano di utilizzare la sfaccettatura per l'effetto I w anted. La sfaccettatura non mi dà l'effetto che sto cercando. Il grafico finale che cercavo è il seguente:

final graph

Se si nota, il principale segno di spunta bianco in y = 10 è più spessa rispetto agli altri segni di graduazione. Questa linea più spessa è la geom_line con size = 1 che nasconde i boxplot indesiderati.

Vorrei poter combinare più oggetti geom in modo più uniforme. Ho segnalato questo come un bug sul github di Hadley, ma Hadley ha detto che questo è il modo in cui position_dodge si comporta in base alla progettazione. Immagino che sto usando ggplot2 in un modo non standard e soluzioni alternative sono il modo per andare su questo tipo di problemi. Comunque, spero che questo aiuti alcuni membri della R a spingere un po 'più in là la grande funzionalità di ggplot.

+1

C'è qualche modo migliore per gestire questo 2.5 anni dopo? Ho la stessa situazione Ho provato a usare expand.grid() per creare un set di dati con NA per tutte le combinazioni di fattore di livello mancanti della variabile I am plotting, e sembrano essere semplicemente ignorati. – Michael

+0

https://github.com/hadley/ggplot2/issues/688 Forse no :( – Michael

+0

Io che c'era, ho avvolto il codice ggplot in una funzione e ho reso la linea bianca asse y un parametro di questa funzione Il motivo è che, se i dati incrociano y = 0, cadrà sotto la linea bianca, rendendo la soluzione troppo ovvia e fastidiosa. – JAponte

risposta

1

Dopo alcune soluzioni, mi si avvicinò con il risultato che cercavo ... (tipo di)

data   <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

p <- ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
     position=position_dodge(width=.60), 
     data=data, 
     outlier.size = 1.2, 
     na.rm=T) + 
     geom_line(aes(x=x, y=y), 
       data=data.frame(x=c(0,3),y=rep(0,2)), 
       size = 1, 
       col='white') 
print(p) 

solution with workaround

Alcune persone raccomandate utilizzando sfaccettatura per l'effetto che volevo. La sfaccettatura non mi dà l'effetto che sto cercando. Il grafico finale che cercavo è il seguente:

final graph

Se si nota, il principale segno di spunta bianco in y = 10 è più spessa rispetto agli altri segni di graduazione. Questa linea più spessa è la geom_line con size = 1 che nasconde i boxplot indesiderati.

Vorrei poter combinare più oggetti geom in modo più uniforme. Ho segnalato questo come un bug sul github di Hadley, ma Hadley ha detto che questo è il modo in cui position_dodge si comporta in base alla progettazione. Immagino che sto usando ggplot2 in un modo non standard e soluzioni alternative sono il modo per andare su questo tipo di problemi. Comunque, spero che questo aiuti alcuni membri della R a spingere un po 'più in là la grande funzionalità di ggplot.

2

x di B non ha valori, quindi è possibile aggiungere "B", 0, "x" che indica essenzialmente che non esiste alcuna distribuzione di "valori" per x di B. La mediana e altri percentili sono pari a zero.

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
      values=c(3,2,1,4,NA,NA,4,5,6,7,8,9,0), 
      ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

Inoltre non c'è bisogno di aggiungere parametri di posizione qui, perché se si considera come un fattore x, ggplot - geom_boxplot saranno automagicamente schivare ai lati.

print(ggplot() + 
    scale_colour_hue(guide='none') + 
    geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
    data=data, 
    outlier.size = 1.2, 
    na.rm=T)) 

+3

Questo può essere un po 'ingannevole annuncio IMO. La soluzione ideale non avrebbe boxplot o "linee" a zero. Così com'è, per me questo direbbe che 'x' per B ha valori a 0, che non è l'effetto desiderato. –

+0

@ RomanLuštrik: In questa situazione ideale, vorrei andare con una trama di casella senza spazio assegnato per "x di B" e questo è quello che faccio nella mia ricerca. Se utilizzo i valori 0 per "x di B", includerò una piccola descrizione di ciò che è il valore di base per i valori ~ factor (cat). Dipende da come si interpretano i risultati. OP stava cercando di usare i parametri position_dodge che in realtà sono già stati implementati quando i valori di x sono categoriali. – Sathish

+0

Grazie per il feedback @Sathish! Questo è un ottimo inizio. Il parametro dodge è impostato su .6 in modo che i relativi boxplots si sovrappongano abbastanza da riflettere la loro relazione, ma non così tanto che i dati finiranno per nascondere parzialmente i dati.Potrei vivere con scatole finte per categorie senza valori, ma forse ho bisogno di renderle trasparenti per i casi vuoti. Ho semplificato il problema il più possibile prima di postare, ma il grafico originale è un po 'più complesso. Può includere molte più (50+) categorie sull'asse x. – JAponte

1

Ho appena ricevuto un indizio per utilizzare sfaccettatura da uno dei commenti postati da Hadley al suo git site, quindi i crediti va a Hadley, il manutentore del pacchetto di ggplot2!

Vedere se questo è quello che volevi.Per ulteriori informazioni sulle opzioni sull'impostazione i baffi ed altri in questa trama, controllare questa pagina di aiuto nel pacchetto ggplot2:

?stat_boxplot 

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
      values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
      ind=c('x','x','x','x','x','x','y','y','y','y','y','y')) 

p <- ggplot(data = data, aes(factor(cat), values))      
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) + facet_grid(.~ind) 

enter image description here

per aggiungere colori alla trama, che a mio parere è uno ridondante come si è già sfaccettatura della trama basata sulla variabile "ind", provate questo:

p <- ggplot(data, aes(factor(cat), values, fill = ind))      
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) + facet_grid(.~ind) 

enter image description here

HTH !

+0

Mi è appena venuto in mente che avrei dovuto suggerirti di usare la sfaccettatura prima di aggiungere ulteriori punti dati di base per riempire i valori mancanti, e ricordo bene le sfaccettature del libro di Hadley su ggplot2. – Sathish

+0

Grazie per il tuo aiuto @sathish. Ho risposto alla mia domanda, ma non l'ho ancora accettato perché Hadley ora pensa che la mia soluzione alternativa non dovrebbe essere necessaria. Ha riaperto il bug report che ho presentato pochi giorni fa. Gli darò un'altra settimana per vedere se otteniamo una soluzione definitiva. Grazie ancora! – JAponte

+0

Ottimo! Non sapevo che tu avessi riferito al GIT, in ogni caso lascia passare il dito e spero che qualcuno ti fornisca le opzioni necessarie. – Sathish

Problemi correlati