2012-04-13 20 views
12

Utilizzo di ggplot2 Sto creando un istogramma con un fattore sull'asse orizzontale e un altro fattore per il colore di riempimento, utilizzando una posizione schivata. Il mio problema è che il fattore di riempimento a volte prende solo un valore per un valore del fattore orizzontale e, senza nulla da schivare, la barra occupa l'intera larghezza. C'è un modo per evitare di schivare nulla in modo che tutte le larghezze delle barre siano le stesse? O in modo equivalente per tracciare gli 0?Un modo per evitare sempre un istogramma?

Per esempio

ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) + 
geom_histogram(position = "dodge") 

enter image description here

This answer ha un paio di idee. È stato anche chiesto prima che venisse rilasciata la nuova versione, quindi forse qualcosa è cambiato? Usando le faccette (anche mostrato here) non mi piace per la mia situazione, anche se suppongo che la modifica dei dati e l'utilizzo di geom_bar potrebbero funzionare, ma non è elegante. Inoltre, quando provai sfaccettatura comunque

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) + 
    geom_bar() + facet_grid(~factor(carb)) 

ottengo l'errore "Errore nei layout_base (dati, cols, goccia = goccia): almeno uno strato deve contenere tutte le variabili usate per sfaccettatura"

I che potrei generare una trama di dati di conteggi e quindi utilizzare geom_bar,

mtcounts <- ddply(subset(mtcars, select = c("carb", "gear")), 
    .fun = count, .variables = c("carb", "gear")) 

compilando i livelli che non sono presenti con 0 di. Qualcuno sa se funzionerebbe o se c'è un modo migliore?

+2

So che non si considera l'ideale, ma penso che pre-calcolare i conteggi e l'utilizzo di geom_bar sarebbe il mio modo preferito di fare questo. – joran

risposta

11

Aggiornatogeom_bar esigenze stat = "identity"

Non sono sicuro se questo è troppo tardi per voi, ma vedo la risposta ad un recente post here Cioè, mi piacerebbe prendere il consiglio di Joran di pre-calcolare i conteggi al di fuori della chiamata ggplot e per utilizzare geom_bar. Come per la risposta ad altri post, i conteggi sono ottenuti in due passaggi: in primo luogo, si ottiene una crosstabulation dei conteggi usando dcast; poi secondo, melt la tavola di contingenza.

library(ggplot2) 
library(reshape2) 

dat = dcast(mtcars, factor(carb) ~ factor(gear), fun.aggregate = length) 
dat.melt = melt(dat, id.vars = "factor(carb)", measure.vars = c("3", "4", "5")) 
dat.melt 

(p <- ggplot(dat.melt, aes(x = `factor(carb)`, y = value, fill = variable)) + 
    geom_bar(stat = "identity", position = "dodge")) 

Il grafico:

enter image description here

+0

Attenzione a collegare anche l'immagine del risultato finale? –

+0

Ho aggiunto il grafico e ho apportato un paio di modifiche redazionali per chiarire la risposta. –

+0

Non è mai troppo tardi! Grazie per aver ampliato quel commento in una risposta completa. – Gregor

Problemi correlati