2016-02-12 154 views
3

我想繪製用於邏輯迴歸的組合圖作爲函數logi.hist.plot,但我想用ggplot2(美學原因)來完成。ggplot2:如何在單個圖中組合直方圖,小地圖和邏輯迴歸預測

的問題是,只有直方圖的一個應有的scale_y_reverse()。

有沒有辦法在一個圖來指定這個(見下面的代碼),或者通過使用可傳遞到以前的情節座標重疊兩個柱狀圖?

ggplot(dat) + 
    geom_point(aes(x=ind, y=dep)) + 
    stat_smooth(aes(x=ind, y=dep), method=glm, method.args=list(family="binomial"), se=FALSE) + 
    geom_histogram(data=dat[dat$dep==0,], aes(x=ind)) + 
    geom_histogram(data=dat[dat$dep==1,], aes(x=ind)) ## + scale_y_reverse() 

這最後的情節是什麼,我一直在努力達到:

derisable outcome

回答

7

您沒有提供一個可重複的例子,所以這裏的用假數據的例子。

我們用geom_segment創建直方圖中的「條」,也創造了地毯地塊。調整size參數改變「欄中的」寬度直方圖。在下面的例子中,欄高度等於給定x範圍內的值的百分比。如果你想改變杆的絕對高度,只是一個比例係數,當你創建直方圖計數的h數據幀繁殖n/sum(n)

要生成柱狀圖計數的情節,我們預彙總數據創建直方圖值。請注意0​​函數中的ifelse語句,該函數調整pct的值以獲取圖中的上行和下行柱,具體取決於y分別是0還是1。您可以在劇情代碼本身中執行此操作,但是您需要對geom_segment進行兩次單獨調用。

library(dplyr) 

# Fake data 
set.seed(1926) 
dat = data.frame(y = sample(0:1, 1000, replace=TRUE)) 
dat$x1 = rnorm(1000, 5, 2) * (dat$y+1) 

# Summarise data to create histogram counts 
h = dat %>% group_by(y) %>% 
    mutate(breaks = cut(x1, breaks=seq(-2,20,0.5), labels=seq(-1.75,20,0.5), 
         include.lowest=TRUE), 
     breaks = as.numeric(as.character(breaks))) %>% 
    group_by(y, breaks) %>% 
    summarise(n = n()) %>% 
    mutate(pct = ifelse(y==0, n/sum(n), 1 - n/sum(n))) 

ggplot() + 
    geom_segment(data=h, size=4, show.legend=FALSE, 
       aes(x=breaks, xend=breaks, y=y, yend=pct, colour=factor(y))) + 
    geom_segment(dat=dat[dat$y==0,], aes(x=x1, xend=x1, y=0, yend=-0.02), size=0.2, colour="grey30") + 
    geom_segment(dat=dat[dat$y==1,], aes(x=x1, xend=x1, y=1, yend=1.02), size=0.2, colour="grey30") + 
    geom_line(data=data.frame(x=seq(-2,20,0.1), 
          y=predict(glm(y ~ x1, family="binomial", data=dat), 
             newdata=data.frame(x1=seq(-2,20,0.1)), 
             type="response")), 
      aes(x,y), colour="grey50", lwd=1) + 
    scale_y_continuous(limits=c(-0.02,1.02)) + 
    scale_x_continuous(limits=c(-1,20)) + 
    theme_bw(base_size=12) 

enter image description here