2012-06-13 13 views
29

C'è un modo per impostare una larghezza costante per geom_bar() in caso di dati mancanti nell'esempio delle serie temporali di seguito? Ho provato a impostare width in aes() senza fortuna. Confrontare la larghezza delle barre da maggio11 a giugno '11 nella trama sotto l'esempio di codice.Larghezza coerente per geom_bar in caso di dati mancanti

colours <- c("#FF0000", "#33CC33", "#CCCCCC", "#FFA500", "#000000") 
iris$Month <- rep(seq(from=as.Date("2011-01-01"), to=as.Date("2011-10-01"), by="month"), 15) 

colours <- c("#FF0000", "#33CC33", "#CCCCCC", "#FFA500", "#000000") 
iris$Month <- rep(seq(from=as.Date("2011-01-01"), to=as.Date("2011-10-01"), by="month"), 15) 
d<-aggregate(iris$Sepal.Length, by=list(iris$Month, iris$Species), sum) 
d$quota<-seq(from=2000, to=60000, by=2000) 
colnames(d) <- c("Month", "Species", "Sepal.Width", "Quota") 
d$Sepal.Width<-d$Sepal.Width * 1000 
g1 <- ggplot(data=d, aes(x=Month, y=Quota, color="Quota")) + geom_line(size=1) 
g1 + geom_bar(data=d[c(-1:-5),], aes(x=Month, y=Sepal.Width, width=10, group=Species, fill=Species), stat="identity", position="dodge") + scale_fill_manual(values=colours) 

plot

+1

Esiste un problema simile [qui] (https://github.com/hadley/ggplot2/issues/235) tuttavia tratta solo di 'stats' che non possono gestire il parametro width. 'position = 'dodge'' sembra avere lo stesso fallimento. Qualcuno con un po 'più di conoscenza di 'ggplot' potrebbe voler appesantire, ma questo sembra un potenziale bug. – Justin

+0

Mi sono imbattuto anche in questo problema. Buono a sapersi. Per ora, userò la soluzione alternativa riportata di seguito riempiendo i valori con NA. – tcash21

+0

Nella sua risposta a https://github.com/tidyverse/ggplot2/issues/1776, Hadley dice: _E 'così che schivare funziona. Potresti invece provare a sfaccettatura._ BTW, questo problema è già stato affrontato più volte su SO: [qui] (http://stackoverflow.com/q/12806260/3817004) e [qui] (http: // StackOverflow .com/q/15367762/3817004), ad es – Uwe

risposta

24

Il modo più semplice è quello di integrare impostare i dati in modo che ogni combinazione è presente, anche se ha NA come il suo valore. Prendendo un esempio più semplice (come il vostro ha un sacco di funzioni non necessarie):

dat <- data.frame(a=rep(LETTERS[1:3],3), 
        b=rep(letters[1:3],each=3), 
        v=1:9)[-2,] 

ggplot(dat, aes(x=a, y=v, colour=b)) + 
    geom_bar(aes(fill=b), stat="identity", position="dodge") 

enter image description here

Questo dimostra il comportamento che si sta cercando di evitare: nel gruppo "B", non c'è un gruppo "a" , quindi le barre sono più larghe. Supplemento dat con un dataframe con tutte le combinazioni di a e b:

dat.all <- rbind(dat, cbind(expand.grid(a=levels(dat$a), b=levels(dat$b)), v=NA)) 

ggplot(dat.all, aes(x=a, y=v, colour=b)) + 
    geom_bar(aes(fill=b), stat="identity", position="dodge") 

enter image description here

+0

Grazie, è una buona soluzione che farà il trucco. – tcash21

+2

Ottengo lo stesso problema quando utilizzo boxplot, ma questo approccio con padding con NA non risolve il problema delle caselle di larghezza disuguale. Le AN sono appena cadute. Il riempimento con 0 sembra funzionare, ma in questo caso si ottiene una trama poderosa che include dati inappropriati. Eventuali suggerimenti? –

+0

@ EtienneLow-Décarie Non è casuale. Chiedilo come una nuova domanda (fai riferimento a questo e mostra come non funziona per i boxplot) e forse qualcun altro può aiutarti. –

2

Ho avuto lo stesso problema, ma era alla ricerca di una soluzione che funziona con il tubo (%>%). Utilizzando tidyr::spread e tidyr::gather dal tidyverse fa il trucco. Io uso gli stessi dati come @ Brian Diggs, ma con i nomi delle variabili in maiuscolo per non finire con i nomi doppi variabili Quando si trasforma a larga:

library(tidyverse) 

dat <- data.frame(A = rep(LETTERS[1:3], 3), 
        B = rep(letters[1:3], each = 3), 
        V = 1:9)[-2, ] 
dat %>% 
    spread(key = B, value = V, fill = NA) %>% # turn data to wide, using fill = NA to generate missing values 
    gather(key = B, value = V, -A) %>% # go back to long, with the missings 
    ggplot(aes(x = A, y = V, fill = B)) + 
    geom_col(position = position_dodge()) 
Problemi correlati