2017-10-04 108 views
2

說我有一些數據,看起來有點像這樣如何更改ggplot(geom_bin2d)中的bin的顏色以反映該區域中的密度與數據集中的平均密度之間的差異?

library(ggplot2) 
library(dplyr) 

employee <- employee <- c('John','Dave','Paul','Ringo','George','Tom','Jim','Harry','Jamie','Adrian') 
quality <- c('good', 'bad') 
x = runif(4000,0,100) 
y = runif(4000,0,100) 
employ.data <- data.frame(employee, quality, x, y) 

我正與一個geom_bin2d情節看起來像這樣

ggplot(dat, aes(x, y)) + 
    geom_bin2d(binwidth = c(20, 20)) + 
    scale_fill_gradient2(low="darkred", high = "darkgreen") 

plot

我怎樣才能改變工作反映與整個數據集中該區域的整體平均值相比,「壞」的x/y點的百分比的箱的顏色?即,如果左下方垃圾箱中「壞」點的平均值爲x數,並且約翰在該區域的平均值爲y​​值較低,那麼如何讓垃圾箱顏色變暗以顯示其數量較低?

我想這可能是工作創造了場均數據:

df2 <- employ.data 
df2$xbin <- cut(df2$x, breaks = seq(0, 100, by = 20)) 
df2$ybin <- cut(df2$y, breaks = seq(0, 100, by = 20)) 
df2 <- df2 %>% group_by(xbin, ybin) %>% mutate(ave_pct = mean(quality == "bad")) 
df2 <- df2 %>% group_by(employee, xbin, ybin) %>% mutate(person_pct = mean(quality == "bad")) 

但我不知道如何繪製這一點。

回答

2

因此,如果我正確地理解了你,你希望通過壞員工的每個相應垃圾箱的比例與壞員工的總體比例相比較來得到垃圾箱。要做到這一點,我改變了這是如何計算的:

df <- employ.data %>% 
    mutate(xbin = cut(x, breaks = seq(0, 100, by = 20)), 
     ybin = cut(y, breaks = seq(0, 100, by = 20)), 
     overall_ave = mean(quality == "bad")) %>% 
    group_by(xbin, ybin) %>% 
    mutate(bin_ave = mean(quality == "bad")) %>% 
    ungroup() %>% 
    mutate(bin_quality = bin_ave - overall_ave) 

這就造成了垃圾桶,然後尋找的「壞」員工素質的整體比例。然後按相應的分類進行分組,並找出每個分箱「壞」員工的百分比。然後,它將每個垃圾桶平均值與總平均值進行比較對於​​,「良好」僱員的比例較高,而「壞」僱員的比例較高的箱子的負數則爲​​。

然後,您可以通過添加fill = bin_qualitygroup = bin_quality參數傳送給aes()通話ggplot內繪製它。您還需要將aes(group = bin_quality)添加到您的geom_bin2d呼叫中。它看起來像這樣:

ggplot(df, aes(x, y, fill = bin_quality, group = bin_quality)) + 
    geom_bin2d(aes(group = bin_quality), binwidth = c(20, 20)) + 
    scale_fill_gradient2(low="darkred", high = "darkgreen") 

這給了你這個圖:

enter image description here

+0

這是絕對完美的,謝謝!你是一個血腥的明星! –

+0

還有一個問題:是否可以過濾掉一個選項並保留整個「垃圾桶質量」範圍?因爲否則它只關注與該員工相關的垃圾箱質量。 –

+0

你可以在管道中添加一個'dplyr :: filter'語句。我不確定你想要過濾什麼,所以我不能給你確切的代碼。 – tbradley