2013-01-24 61 views
3

來自我的第一個問題,希望它的措辭正確。我找不到任何東西,所以我會咬緊牙關。覆蓋ggplot2中的多個geom_tile圖

我想創建一個geom_tile曲線,其爲xy每個組合,我對z 5個變量的所有總和爲1。我想每個x-y組合的平方的顏色反映哪個z數字是最大的。例如,假設我有變量a,b,c,de。如果a=1b=c=d=e=0,正方形將是藍色的,如果b=1a=c=d=e=0它將是紅色等。如果a=b=0.5和其他爲零,則它將是內插顏色(即紫色)。也許更好,紅色和藍色交叉線,但我不知道這是否可能在ggplot

我不知道如何繼續前進。我想過繪製彼此之間的圖,其中每一個圖都是不同的顏色,並且alpha通過例如縮放圖來縮放。 a的值(因此當a = 0時單元格是透明的,當a = 1時單元格是強烈着色的)。也許還有一種方法可以用顏色漸變來實現,但我也在那裏畫了一個空白。

如果任何人都能看到如何做到這一點他們的頭頂,我會非常感激。這是一個與我的實際數據格式相同的隨機數據集。

rand <- matrix(runif(50*50*5), ncol=5, nrow=50*50) 
rand <- rand/apply(rand, 1, sum) # Make sure the numbers sum to one in each row 
d <- data.frame(a = rand[,1], 
       b = rand[,2], 
       c = rand[,3], 
       d = rand[,4], 
       e = rand[,5], 
       expand.grid(x = 1:50, y = 1:50)) 

更新:通過使用從sebastian-c和我自己的數據集的第一個答案,我能夠使這個數字。我使用RColorBrewer包中的函數brewer.pal(5,「Spectral」)獲得顏色。需要一個自定義的傳說,但除此之外,我對它很滿意。純色顯示純粹的「進化穩定策略」(ESS;即不能被突變策略打敗的策略)。重疊顏色區域顯示混合ESS,其中均衡是兩個或更多策略的穩定平衡。

Overlapped geom_tile plots ESS

+0

所以我們假設你有四種顏色:紅色,藍色,綠色和紫色。你如何區分紫色和紅色的組合? –

+0

@ sebastian-c,我同意這是這種方法的一個主要問題:必須將5維矢量投影到3d色彩空間上。此外,連續的3D色彩空間不具備良好的感知品質。這樣一個數字可能看起來很混亂或混亂(取決於數據...) – bdemarest

+0

@bdemarest - 對於這個示例數據集,你是完全正確的。但在實際的數據中,有大塊純色,並且它們之間有重疊區域,所以清楚發生了什麼。我只是不確定如何鏈接到我在這個網站上的數據,而重現它的代碼需要幾個小時才能運行,所以我認爲使用隨機數來表示概念證明會很好。 – lukeholman

回答

1

我把簡化了您的例子有點下降到3列的自由。老實說,我認爲這不會超過2,但這是我如何去做的。我也濫用alpha通道,所以如果你按照不同的順序鋪設瓷磚,顏色會改變。這應該有希望成爲其他人的起點。對於情節

set.seed(100) 

rand <- matrix(runif(100*3), ncol=3, nrow=100) 
rand <- rand/apply(rand, 1, sum) # Make sure the numbers sum to one in each row 
d <- data.frame(a = rand[,1], 
       b = rand[,2], 
       c = rand[,3], 
       expand.grid(x=1:10, y=1:10)) 

現在:首先,我們將生成的數據

ggplot(d, aes(x=x, y=y))+ 
    theme_bw() + #For a clearer background 
    geom_tile(alpha=d$a, fill="red")+ 
    geom_tile(alpha=d$b, fill="blue")+ 
    geom_tile(alpha=d$c, fill="green")+ 
    theme(panel.grid.major=element_blank()) 

enter image description here

我在想,3列,使用的紅,綠,藍量,但是對於大於3列的任何內容都不適用。

編輯:長達3列具體的解決方案(我是混合了藍色和綠色的最多):

d2 <- data.frame(col=rgb(rand), expand.grid(x=1:10, y=1:10)) 

ggplot(d2, aes(x=x, y=y)) + 
    theme_bw()+ 
    geom_tile(aes(fill=col))+ 
    scale_fill_identity() 

enter image description here

如果你設置的紅色,您可以用2種顏色做到這一點,綠色或藍色到0。

+0

嗨塞巴斯蒂安,非常感謝您的幫助(對不起,擰了隨機數矩陣 - 現在修復了)。我喜歡你的第一個解決方案的外觀,但運行它給了我錯誤「錯誤:當設置美學時,它們可能只有一個值,問題:alpha」。另外,在我的實際數據中,大多數方格至少有3個零,所以通常只有一種或兩種顏色重疊,並且不會像隨機數例子中那樣不可解釋。 – lukeholman

+0

@lukeholman你把它放在'aes'電話裏嗎?我沒有。你使用最新的ggplot2(0.9.3)嗎? –

+0

修好了!我想最近的更新中有一些非常重要的東西發生了變化。再次感謝您的幫助,我會玩弄這個數字,並在我有用的時候回覆。 – lukeholman