1

关于如何使用 ggplot2 可视化逻辑拟合的最常被引用的示例似乎非常像这样:

data("kyphosis", package="rpart")  
ggplot(data=kyphosis, aes(x=Age, y = as.numeric(Kyphosis) - 1)) +
      geom_point() + 
      stat_smooth(method="glm", family="binomial")

绘图图像

如果您没有太多重叠数据,则此可视化效果很好,对于拥挤数据的第一个建议似乎是在点的 x 和 y 坐标中使用注入的抖动,然后调整点的 alpha 值。当您到达单个点无用但点分布有用的地步时,是否可以使用 geom_density()、geom_histogram() 或其他东西来可视化数据,但继续沿 y 分割分类变量-用 geom_point() 完成的轴?

根据我的发现, geom_density() 和 geom_histogram() 可以很容易地按分类变量进行拆分/分组,并且可以使用 scale_y_reverse() 轻松地反转两个级别,但我不知道是否甚至可以只移动一个的分类变量分布到图的顶部。任何帮助/建议将不胜感激。

4

2 回答 2

2

annotate()ggplot 中的函数允许您将几何图形添加到具有“不是从数据框的变量映射,而是作为矢量”的属性的图中,这意味着您可以添加与数据框无关的图层。在这种情况下,您的两条密度曲线数据框相关(因为变量在其中),但是因为您试图以不同的方式定位它们,所以 usingannotate()很有用。

这是一种解决方法:

data("kyphosis", package="rpart")  
model.only <- ggplot(data=kyphosis, aes(x=Age, y = as.numeric(Kyphosis) - 1)) +
  stat_smooth(method="glm", family="binomial")

absents <- subset(kyphosis, Kyphosis=="absent")
presents <- subset(kyphosis, Kyphosis=="present")

dens.absents <- density(absents$Age)
dens.presents <- density(presents$Age)

scaling.factor <- 10  # Make the density plots taller
model.only + annotate("line", x=dens.absents$x, y=dens.absents$y*scaling.factor) + 
  annotate("line", x=dens.presents$x, y=dens.presents$y*scaling.factor + 1)

好的

这为每个后凸组添加了两个带有比例密度图的注释层。对于presents变量,y按比例缩放并增加 1 以将其向上移动。

您还可以填充密度图,而不仅仅是使用一条线。而不是annotate("line"...)你需要使用annotate("polygon"...),像这样:

model.only + annotate("polygon", x=dens.absents$x, y=dens.absents$y*scaling.factor, fill="red", colour="black", alpha=0.4) + 
  annotate("polygon", x=dens.presents$x, y=dens.presents$y*scaling.factor + 1, fill="green", colour="black", alpha=0.4)

完美的

从技术上讲,您可以使用,但是当您将情节上annotate("density"...)移一个时,这将不起作用。present它没有移动,而是填充了整个情节:

model.only + annotate("density", x=dens.absents$x, y=dens.absents$y*scaling.factor, fill="red") + 
  annotate("density", x=dens.presents$x, y=dens.presents$y*scaling.factor + 1, fill="green")

坏的

解决该问题的唯一方法是使用多边形而不是密度几何。

最后一个变体:沿 y 轴 = 1 翻转顶部密度图:

model.only + annotate("polygon", x=dens.absents$x, y=dens.absents$y*scaling.factor, fill="red", colour="black", alpha=0.4) + 
  annotate("polygon", x=dens.presents$x, y=(1 - dens.presents$y*scaling.factor), fill="green", colour="black", alpha=0.4)

翻转

于 2013-07-17T14:26:48.597 回答
0

我不确定我明白你的意思,但这里有一个尝试:

dat <- rbind(kyphosis,kyphosis)
dat$grp <- factor(rep(c('smooth','dens'),each = nrow(kyphosis)),
                  levels = c('smooth','dens'))
ggplot(dat,aes(x=Age)) +
      facet_grid(grp~.,scales = "free_y") +
      #geom_point(data=subset(dat,grp=='smooth'),aes(y = as.numeric(Kyphosis) - 1)) +
      stat_smooth(data=subset(dat,grp=='smooth'),aes(y = as.numeric(Kyphosis) - 1),
                  method="glm", family="binomial") +
      geom_density(data=subset(dat,grp=='dens'))

在此处输入图像描述

于 2013-07-17T04:31:05.280 回答