2012-06-13 16 views
29

以下の時系列の例でデータが欠落した場合に、geom_bar()の一定の幅を設定する方法はありますか?私は運がないaes()widthを設定しようとしました。コード例の下のプロットで5月11日から6月11日までの幅を比較してください。データがない場合のgeom_barの一貫性のある幅

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

は、同様の問題は[こちら](ありhttps://github.com/hadley/ggplot2/issues/235)しかし、これはwidthパラメータを扱うことができない 'stats'しか扱っていません。 'position = 'dodge''は同じ失敗をしているようです。 'ggplot'の知識がもう少しある人は、体重を増やしたいと思うかもしれませんが、これは潜在的なバグのようです。 – Justin

+0

私もその問題に出会った。知っておいてよかった。今のところ、NAで値を入力することで、以下の回避策を使用します。 – tcash21

+0

https://github.com/tidyverse/ggplot2/issues/1776への彼の返信で、ハドリーはこう述べています。あなたは代わりにファセットを試してみるといいかもしれません。_BTW、この問題はすでにSOに数回言及されています:[ここ](http://stackoverflow.com/q/12806260/3817004)と[here](http:// stackoverflow .com/q/15367762/3817004)、例えば – Uwe

答えて

24

最も簡単な方法は、すべての組み合わせが、それはその値としてNAを持っている場合でも、存在するように、あなたのデータセットを補完することです。何のグループが「」ありません、グループ「B」に:

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

これはあなたが避けるようにしようとしている行動が示しています(あなたは、不要な機能をたくさん持っているとして)単純な例を取りますバーが広くなります。 abのすべての組み合わせを持つデータフレームでdatを補足:

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

ありがとう、それはトリックを行う良い回避策です。 – tcash21

+2

boxplotを使用するときも同じ問題が発生しますが、この方法ではNAで埋めても不等幅ボックスの問題は解決されません。 NAはちょうど削除されます。 0で埋めればうまくいくように見えますが、それは不適切なデータを含む醜い醜いプロットになります。助言がありますか? –

+0

@ EtienneLow-Décarieオフハンドではありません。新しい質問(これを参考にして、それがボックスプロットではうまくいかないことを示す)として質問してください。誰かが助けてくれるかもしれません。 –

2

私は同じ問題を抱えていたが、パイプ(%>%)で機能するソリューションを探していました。 tidyverseからtidyr::spreadtidyr::gatherを使用すると、このトリックは実行されません。ワイドに変換するとき、私は二重の変数名で終わらないように@Brian Diggsとしてではなく、大文字の変数名と同じデータを使用します。

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()) 
関連する問題