2012-04-13 26 views
12

使用ggplot2我使用閃避位置創建了一個橫軸上的因子和填充顏色的另一個因子的直方圖。我的問題是填充因子有時只取一個值作爲橫向因子的值,而沒有任何東西可以閃避,因此它佔據了整個寬度。有沒有辦法讓它不閃避,因此所有的條寬都是一樣的?或等價地繪製0的?一種總是避開直方圖的方法?

例如

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

enter image description here

This answer有幾個想法。在新版本發佈之前也有人問到,所以可能有所改變?使用方面(也顯示here)我不喜歡我的情況,但我想編輯數據和使用geom_bar可以工作,但它感覺不雅。此外,當我試圖反正磨製

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

我得到的錯誤「錯誤在layout_base(數據,COLS,降=滴): 至少一層必須包含用於磨製所有變量」

我假設我能產生計數的數據幀,然後使用geom_bar

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

填寫中不存在0的水平。有誰知道這是否會奏效,或者有更好的方法?

+2

我知道你不認爲這是理想的,但我想預先計算的數量和使用geom_bar會是這樣的我的首選方式。 – joran 2012-04-14 02:15:04

回答

11

更新geom_bar需求stat = "identity"

我不知道這是否是對你太晚了,但一看便知,以最近的文章中here 也就是說,我會採取Joran的意見,以預先計算在ggplot呼叫之外的計數和使用geom_bar。與其他帖子的答案一樣,計數是通過兩個步驟獲得的:首先,使用dcast獲得計數的交叉表;那麼第二,melt的交叉製表。

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")) 

圖表:

enter image description here

+0

還要注意附加最終結果圖像嗎? – 2012-04-28 07:03:22

+0

我已經添加了圖表,並做了一些編輯性修改以澄清回覆。 – 2012-04-28 07:26:51

+0

永不晚!感謝您將該評論擴展爲完整的答案。 – Gregor 2012-04-28 17:01:38