您沒有提供一個可重複的例子,所以這裏的用假數據的例子。
我們用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)