我正在尝试将逻辑回归的组合图绘制为函数logi.hist.plot,但我想使用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()
最后的情节是我一直在努力实现的目标:
答案 0 :(得分:9)
您尚未提供可重现的示例,因此这里是假数据的示例。
我们使用geom_segment
为直方图创建“条形”,并创建地块图。调整size
参数以更改直方图中的“条形”宽度。在下面的示例中,条形高度等于给定x范围内的值的百分比。如果要更改条形的绝对高度,只需在创建直方图计数的n/sum(n)
数据框时将h
乘以缩放系数。
要生成绘图的直方图计数,我们预先汇总数据以创建直方图值。请注意ifelse
函数中的mutate
语句,该语句调整pct
的值以获取图中的向上和向下条形图,具体取决于y
是否为0或者分别为1或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)