2010-01-14 17 views
17

我正在蒙特卡洛模擬,輸出的格式爲:難道我一直都使用數據幀在GGPLOT2

> d = data.frame(iter=seq(1, 2), k1 = c(0.2, 0.6), k2=c(0.3, 0.4)) 
> d 
iter k1 k2 
1  0.2 0.3 
2  0.6 0.4 

我要生成的圖是:

plot(d$iter, d$k1) 
plot(density(d$k1)) 

我知道該怎麼做使用GGPLOT2相當於地塊,轉換成數據幀

new_d = data.frame(iter=rep(d$iter, 2), 
        k = c(d$k1, d$k2), 
        label = rep(c('k1', 'k2'), each=2)) 

然後密謀很容易。然而,迭代的次數可能非常大,並且k的數量也可能很大。這意味着要搞亂一個非常大的數據框。

有沒有反正我可以避免創建這個新的數據框?

感謝

回答

13

簡答題是「不」,你不能避免創建一個數據框。 ggplot要求數據在數據框中。如果使用qplot,則可以爲x和y指定單獨的向量,但在內部,它仍然會創建一個數據幀,以便傳入參數。

我同意juba的建議 - 學習使用reshape函數,或更好的reshape包與melt/cast函數。一旦你將數據放在長格式中,創建令人驚歎的ggplot圖就更近了!

4

可以使用reshape功能將數據幀轉換爲「長」格式。可能會比你的代碼快一點?

R> reshape(d, direction="long",varying=list(c("k1","k2")),v.names="k",times=c("k1","k2")) 
    iter time k id 
1.k1 1 k1 0.2 1 
2.k1 2 k1 0.6 2 
1.k2 1 k2 0.3 1 
2.k2 2 k2 0.4 2 
2

所以只是添加到以前的答案。隨着qplot你可以做

p <- qplot(y=d$k2, x=d$k1) 

然後從那裏建立它,例如,與

p + theme_bw() 

但我同意 - 融化/演員是基本上是前進的方式。

相關問題