2012-06-13 9 views
29

Gibt es eine Möglichkeit, bei fehlenden Daten im folgenden Zeitreihenbeispiel eine konstante Breite für geom_bar() einzustellen? Ich habe versucht, width in aes() ohne Glück zu setzen. Vergleichen Sie die Balkenbreite von Mai '11 bis Juni '11 im Diagramm unter dem Codebeispiel.Konsequente Breite für geom_bar bei fehlenden Daten

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

Es gibt ein ähnliches Problem [hier] (https://github.com/hadley/ggplot2/issues/235) aber es handelt sich nur um 'stats', die den width-Parameter nicht verarbeiten können. 'Position = 'Ausweichen' scheint das gleiche Versagen zu haben. Jemand mit ein bisschen mehr "ggplot" Wissen möchte vielleicht eingewogen werden, aber das klingt wie ein potentieller Fehler. – Justin

+0

Ich bin auch auf dieses Problem gestoßen. Gut zu wissen. Fürs Erste verwende ich die unten beschriebene Problemumgehung, indem ich Werte mit NA ausfülle. – tcash21

+0

In seiner Antwort auf https://github.com/tidyverse/ggplot2/issues/1776 sagt Hadley: _Das funktioniert so. Vielleicht möchten Sie Facetting stattdessen versuchen. _ BTW, dieses Problem wurde schon mehrmals auf SO: [hier] (http://stackoverflow.com/q/12806260/3817004) und [hier] (http: // stackoverflow .com/q/15367762/3817004), z – Uwe

Antwort

24

Der einfachste Weg ist Ihr Datensatz zu ergänzen, so dass jede Kombination vorhanden ist, auch wenn es NA als Wert hat. Ein einfacheres Beispiel (wie bei Sie vielen unnötigen Funktionen haben):

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

Dies zeigt das Verhalten, das Sie versuchen zu vermeiden: in Gruppe „B“, gibt es keine Gruppe ist „a“ Die Balken sind also breiter. Nachtrag dat mit einem Datenrahmen mit allen Kombinationen von a und 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

Danke, es ist eine gute Workaround, die den Trick machen wird. – tcash21

+2

Ich bekomme das gleiche Problem bei der Verwendung von Boxplot, aber dieser Ansatz durch Auffüllen mit NA repariert nicht meine ungleiche Breite Boxen Problem. Die NAs werden einfach fallen gelassen. Padding mit 0 scheint zu funktionieren, aber das macht dann eine mächtige hässliche Handlung, die unpassende Daten enthält. Irgendwelche Vorschläge? –

+0

@ EtienneLow-Décarie Nicht ohne weiteres. Stellen Sie es als eine neue Frage (beziehen Sie sich darauf und zeigen Sie, wie es für Boxplots nicht funktioniert) und vielleicht kann jemand anderes helfen. –

2

Ich hatte das gleiche Problem, aber war auf der Suche nach einer Lösung, die mit dem Rohr arbeitet (%>%). Die Verwendung von tidyr::spread und tidyr::gather von der tidyverse macht den Trick. Ich benutze die gleichen Daten wie @ Brian Diggs, aber mit Großvariablennamen nicht mit doppelten Variablennamen enden, wenn auf breite Umwandlung:

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()) 
Verwandte Themen