在r中的ggplot2中分割y轴上的分布可视化

时间:2013-07-17 03:27:46

标签: r ggplot2 data-visualization

最常见的如何使用ggplot2可视化逻辑拟合的示例似乎非常类似:

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

plot image

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

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

2 个答案:

答案 0 :(得分:1)

ggplot中的annotate()函数允许您将地图添加到具有"are not mapped from the variables of a data frame, but are instead in as vectors,"属性的绘图中,这意味着您可以添加与数据框无关的图层。在这种情况下,您的两条密度曲线 与数据框相关(因为变量在其中),但由于您尝试以不同方式定位它们,因此使用annotate()非常有用。< / p>

这是一种方法:

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)

Good

这为每个脊柱后凸组添加了两个带有缩放密度图的注释图层。对于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)

Perfect

从技术上讲,您可以使用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")

Bad

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

最后一个变体:沿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)

Flipped

答案 1 :(得分: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'))

enter image description here