2013-12-19 73 views
-1

我正在嘗試創建一個postion =「fill」,它表示y軸上的分配(總是爲100)和另一個x軸上的變量。變量1-4是數字整數,變量5也是數字。變量5是一個連續的數字。所有五個變量都在同一行上。用4個變量對第5個變量繪製填充折線圖ggplot2

Y軸:變量1 +變量2 +變量3 + 4可變= 100 X軸:可變5

有一種方法來做到這一點而不熔化我的數據表?

示例代碼,注意:運行速度有點慢,由於我是如何設置的變量1-4 ...

library(combinat) 
combinations <- combn(100, 4) 
permutations <- combinations[, colSums(combinations) == 100] 
rm(combinations) 

data <- t(rbind(permutations, 
    replicate(ncol(permutations), cumprod(1+rnorm(20, 0.05, 0.30))[20]) 
)) 
+0

爲什麼你不想融化你的桌子?你能舉一個可重現的例子嗎? –

+0

我可能會融化它,但很好奇,如果有辦法更直接地做到這一點,沒有這個功能。我沒有一個可重複的例子,但你可以想象一個數據幀,1000個觀察值的5個變量,其中變量1-4總和爲100,並且都是1到100之間的整數,變量5在0.8和1.0之間是連續的 – rrbest

+1

Downvote是「......沒有一個可重複的例子,但你可以想象......」。這意味着我們應該爲你做出榜樣。 –

回答

0

一個產生重複的例子,辦法是

set.seed(1) 
data_ex <- data.frame(t(rmultinom(1000,prob=rep(0.25,4),size=100)), 
         v5=runif(1000,0.8,1)) 

和那麼

library(ggplot2) 
library(reshape2) 
ggplot(melt(data_ex,id.var="v5")) + 
    geom_area(aes(x=v5,y=value,fill=variable)) 

繪製該圖。

如果你真的做的事情,你能避免使用melt硬盤的方式,但melt是多少(很多很多)更容易!

cumvals <- t(apply(data_ex[,1:4],1,cumsum)) 
data2 <- data.frame(cumvals,v5=data_ex$v5) 
ggplot(data2,aes(x=v5)) + 
    ## these must go in reverse order 
      geom_area(aes(y=X4),fill="green")+ 
      geom_area(aes(y=X3),fill="purple")+ 
     geom_area(aes(y=X2),fill="red")+ 
     geom_area(aes(y=X1),fill="blue")