2013-06-19 231 views
2

我在製作條形圖時出現了問題,其中y軸不計數,但是來自變量的值。ggplot2 - 堆疊/遮擋條形圖

我使用stat=identity,這對一個變量很合適。但是如果我有兩個變量並且想要創建堆疊/遮擋條形圖呢?

我這裏有一些模擬數據:

foo <- data.frame(case=c('A','B','C'), var1=rnorm(3), var2=rnorm(3)) 

所以我的三個糾紛案對x軸分別爲A,B和C.我想繪製VAR1和VAR2爲條形的值。謝謝!

回答

4

首先,更改您的示例數據。製作數據框時,您不需要cbind(),因爲在這種情況下,您可以將所有列作爲因子。

foo <- data.frame(case=c('A','B','C'), var1=rnorm(3), var2=rnorm(3)) 

要使用兩個變量barplot最簡單的方法是將數據從寬到長格式化。

library(reshape2) 
foo.long<-melt(foo) 
foo.long 
    case variable  value 
1 A  var1 0.7150827 
2 B  var1 -0.5279363 

現在使用value爲y值和variable用於填充。 stat="identity"position="dodge"將確保實際值被繪製並且酒吧被鎖定。

ggplot(foo.long, aes(case,value,fill=variable))+ 
     geom_bar(position="dodge",stat="identity") 

enter image description here

+0

感謝一大堆!我也改變了我的問題中的模擬數據,以免混淆未來的讀者。 – Heisenberg

+0

嗯,我剛剛遇到一個真實的實例,其中我的數據框中的所有列(從Excel導入)都是向量。你能否解釋或指出我對此行爲的資源? R何時認爲一列是因素? – Heisenberg

+0

出於好奇,是否可以控制哪個變量首先從ggplot繪製?或者我必須重新排列數據框? – Heisenberg

1

我不回答這個問題,在SENS我不使用ggplot2。但是,如果您想使用其寬格式的data.frame,另一種方法是使用「格子from晶格package. To get ggplot2 theme, I am using latticeExtra`。使用@Didzis數據:

library(latticeExtra) 
barchart(var1+var2~case,data=foo,origin=0, 
    par.settings = ggplot2like(),axis=axis.grid,auto.key=TRUE) 

enter image description here