2012-06-13 13 views
29

Czy istnieje sposób ustawiania stałej szerokości dla geom_bar() w przypadku brakujących danych w poniższym przykładzie szeregów czasowych? Próbowałem ustawić width w aes() bez powodzenia. Porównaj od 11 do 11 czerwca szerokość pasków na wykresie poniżej przykładowego kodu.Stała szerokość dla geom_bar w przypadku brakujących danych

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

Jest podobny problem [tutaj] (https://github.com/hadley/ggplot2/issues/235) jednak ma do czynienia tylko z 'stats', które nie mogą obsłużyć parametru width. 'position = 'dodge'' wydaje się mieć takie samo niepowodzenie. Ktoś, kto ma nieco więcej wiedzy o 'ggplot' może chcieć wbić, ale to brzmi jak potencjalny błąd. – Justin

+0

Natknąłem się również na tę kwestię. Dobrze wiedzieć. Na razie użyję poniższego obejścia, wypełniając wartości NA. – tcash21

+0

W swojej odpowiedzi na https://github.com/tidyverse/ggplot2/issues/1776, Hadley mówi: "Tak działa uniki. Możesz spróbować zamiast tego faseta._ BTW, ten problem został już kilkakrotnie skierowany na SO: [tutaj] (http://stackoverflow.com/q/12806260/3817004) i [tutaj] (http: // stackoverflow .com/q/15367762/3817004), np – Uwe

Odpowiedz

24

Najprostszym sposobem jest uzupełnienie danych ustawiony tak, że każda kombinacja jest obecny, nawet jeśli ma NA jako jego wartości. Biorąc prostszy przykład (jak twój ma wiele niepotrzebnych funkcji):

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

To pokazuje zachowanie staramy się unikać: w grupie „B”, nie ma grupy „a” , więc paski są szersze. Suplement dat z dataframe ze wszystkimi kombinacjami a i 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

Dzięki, to dobre obejście, które załatwi sprawę. – tcash21

+2

Ten sam problem pojawia się przy korzystaniu z boxplot, ale to podejście poprzez dopełnianie za pomocą NA nie rozwiązuje mojego problemu z nierównymi szerokościami pól. NA są właśnie porzucane. Padding z 0 wydaje się działać, ale wtedy powstaje potężna, paskudna fabuła, która zawiera nieodpowiednie dane. Jakieś sugestie? –

+0

@ EtienneLow-Décarie Nie bez powodu. Zadaj to jako nowe pytanie (odwołaj się do tego i pokaż, jak to nie działa na pudełkach), a może ktoś inny może ci pomóc. –

2

miałem ten sam problem, ale szukałem rozwiązania, które współpracuje z rury (%>%). Korzystanie z tidyr::spread i tidyr::gather z tidyverse rozwiązuje problem. Używam tych samych danych jak @Brian Diggs, ale z wielkimi nazwami zmiennych, aby nie skończyć z podwójnymi nazwami zmiennych podczas przekształcania się szeroko:

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()) 
Powiązane problemy