ggplot2:如何在单个图中组合直方图、毛毯图和逻辑回归预测?

9
我正在尝试绘制 logistic 回归的组合图表,类似于 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()

这个最终的图表就是我一直在努力实现的:

derisable outcome

1个回答

15

我们使用geom_segment来创建直方图的“条形”和地毯图。调整size参数可更改直方图中“条形”的宽度。在下面的示例中,条形高度等于给定x范围内值的百分比。如果您想更改条形的绝对高度,请在创建直方图计数的数据框h时将n/sum(n)乘以缩放因子。

为了生成绘图所需的直方图计数,我们预先汇总数据以创建直方图值。请注意mutate函数中的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)

在此输入图像描述


可以将第二个 geom_segment 替换为 geom_rug(dat=dat[dat$y==0,], sides = "b"),将第三个替换为 geom_rug(dat=dat[dat$y==1,], sides = "t") - JWilliman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接