2014-12-06 30 views
3

我想創建一個ggplot,其中統計參數根據審美映射因子而變化。具體來說,我想用stat_density2d()創建一個等值線圖,我想將離散因子映射爲顏色,並且我想爲每個因子級別指定不同的中斷值。ggplot2:一個非美學參數可以因因變化嗎?

這裏有一個最小的工作示例:

d <- data.frame(x=c(rnorm(500), rnorm(500, 2)), y=rnorm(1000), z=c(rep("a", 500), rep("b", 500))) 

ggplot(d, aes(x, y, fill=z)) + 
     stat_density2d(breaks=.05, geom="polygon", alpha=.5) 

enter image description here

這就是我要去的,除了休息是跨因素是相同的。我正在尋找一種方法來爲每個因素指定不同的中斷值。這樣做的一個方法是爲每一個因素單獨的層:

ggplot() + 
     stat_density2d(data=d[d$z=="a",], aes(x, y), breaks=.05, geom="polygon", alpha=.5, fill="red") + 
     stat_density2d(data=d[d$z=="b",], aes(x, y), breaks=.1, geom="polygon", alpha=.5, fill="blue") 

enter image description here

但因爲我失去的傳說,這是不可行的,它是太麻煩的情況下,有兩個以上的因素水平。

我想結合上述兩種情況的優點。我幾乎是積極的,我已經看到了一種方法來完成我想要做的事情,但現在似乎無法找到它是相關的。任何人對可能的解決方案都有想法?

+1

採取解決方案,我從來沒有見過這樣的方式來做到這一點裏面ggplot,但我認爲你可以通過(a)預處理你的數據,或者(b)轉換你的數據來很容易地做到這一點。 – Gregor 2014-12-06 01:35:03

回答

5

前從幾年Remebered這一點 - 所以直接從Kohske's answer

# Data 
set.seed(1)  
d <- data.frame(x=c(rnorm(500), rnorm(500, 2)), y=rnorm(1000), 
            z=c(rep("a", 500), rep("b", 500))) 

library(plyr) 
library(ggplot2) 

hls <- mapply(function(x, b) stat_density2d(data = x, breaks = b, 
        geom="polygon", alpha=.5), dlply(d, .(z)), c(0.05, 0.1)) 

ggplot(d, aes(x, y, fill=z)) + hls + scale_fill_manual(values=c("red", "blue")) 

enter image description here

# Compare 
ggplot() + 
    stat_density2d(data=d[d$z=="a",], aes(x, y), breaks=.05, geom="polygon", 
                 alpha=.5, fill="red") + 
    stat_density2d(data=d[d$z=="b",], aes(x, y), breaks=.1, geom="polygon", 
                alpha=.5, fill="blue") 
+0

美麗!非常感謝。 – mmk 2014-12-06 02:17:55

+1

歡迎,但所有相信Kohske的答案 – user20650 2014-12-06 02:20:32

+1

這是今天要學習的另一件事。我也會檢查Kohske的帖子。感謝分享這個想法。 – jazzurro 2014-12-06 02:29:57