2013-04-08 19 views
6

Sto provando a creare una versione migliore di un grafico di base R con ggplot2. Non solo per avere una leggenda comune, ma anche perché mi piacciono gli stili e la personalizzazione di ggplot2. I miei dati sono composti da 3 dataset separati che contengono gli stessi due gruppi di osservazioni per diversi (ma diversi) trattamenti. Quindi voglio generare 3 grafici separati in 1 grafico con una legenda comune, tuttavia con livelli di fattore diversi. Per illustrare il mio punto la prima immagine qui è quello che ho generato con base R finora: r base plot closest plot realisationRimuovi i fattori vuoti dal grafico a barre in cluster in ggplot2 con più facce

Ho provato a generare una trama ggplot2 con dati fittizi che ha esattamente la stessa struttura miei dati:

foo<-data.frame(c(letters,letters),c(rep('T1',26),rep('T2',26)), 
runif(52),rep(c(rep('Ori1',12),rep('Ori2',8),rep('ori3',6)),2)) 
names(foo)<-c('Treatment','Type','Count','Origin') 

a<-ggplot(foo,aes(x = factor(Treatment),y = Count)) 
a+ facet_grid(Origin~., scales="free_y", space="free") + 
geom_bar(stat="identity",aes(fill=factor(foo$Type)),position="dodge") 
+theme_bw()+theme(axis.text.x=element_text(angle=60,hjust=1))+coord_flip() 

Che mi dà il seguente risultato indesiderato. failed ggplot2 image

sono consapevole dei temi di overflow dello stack Removing Unused Factors from a Facet in ggplot2 e How can I remove empty factors from ggplot2 facets? tuttavia, non trattano con i grafici a barre in cluster cerco di realizzare qui e sento che sono il problema, ma non ora come risolverlo. Tutti i suggerimenti sono benvenuti

+3

Credo che finché non viene risolto (è complicato), si è bloccati ad omettere 'coord_flip' e usando' facet_wrap (~ Origin, scale = "free_x") 'invece. – joran

+0

@joran Grazie per il commento ma non risolve il problema ... il 'coord_flip' non contribuisce realmente al problema qui, e l'ho appena incluso perché mi piace che la trama sia formattata in questo modo. Il problema principale è come preservare il 'position =" dodge "' in tutte le sfaccettature. Forse dovrei chiarire che non voglio veramente _reprodurre_ il grafico base in quanto tale, voglio solo che l'essenza delle trame sia utilizzabile in uno stile ggplot2. –

+1

Non penso che tu abbia effettivamente provato ciò che ho proposto. Il punto è che al momento 'coord_flip' non gioca sempre bene con' scale = "libero" '. Questo è un problema noto. – joran

risposta

7

per illustrare il mio commento:

a<-ggplot(foo,aes(x = factor(Treatment),y = Count)) 
a+ facet_wrap(~Origin, scales="free_x") + 
    geom_bar(stat="identity",aes(fill=factor(Type)),position="dodge") + 
    theme_bw() + 
    theme(axis.text.x=element_text(angle=60,hjust=1)) 

enter image description here

Si noti che se si aggiunge coord_flip e passa a free_y si ottiene un errore specifico su coord_flip non funziona con alcuni tipi di scale libere, che è il fonte del tuo problema

+1

Perché c'è un 'pippo $' in 'fill = factor (foo $ Type)'. Non è necessario vero? In realtà cambia la trama abbastanza da quello che stavo pensando: 'ggplot (data = foo, aes (x = factor (Trattamento), y = Count)) + geom_bar (stat =" identity ", aes (fill = factor (Tipo)), position = "dodge") + theme_bw() + facet_grid (~ Origin, scale = "free", space = "free") ' – Arun

+1

@Arun Hai ragione, stavo solo copiando + incollando il loro codice, e si è concentrato sul lasciare cadere i fattori inutilizzati. – joran

+0

grazie a tutti e due! Apparentemente origine ~. nel facet.wrap originale non ho generato quello che volevo, ma ho anche ricevuto un errore usando semplicemente Type al posto di foo $ Type (dovrebbe essere lo stesso, giusto?). @Arun: il tuo commento mi ha dato esattamente quello che volevo. @joran: grazie per aver individuato questo errore comune con 'coord_flip' ... suppongo che mi limiterò al normale barplot impilato. –

Problemi correlati