堆积直方图,如流式细胞仪

时间:2014-05-25 05:05:47

标签: r ggplot2 histogram

我试图使用ggplot或base R来生成如下内容:

enter image description here

我知道如何用ggplot2做直方图,并且可以使用facet_grid或facet_wrap轻松分离它们。但是我想要错开"它们是垂直的,因此它们有一些重叠,如下所示。对不起,我不允许发布我自己的图片,而且很难找到我想要的更简单的图片。如果可以,我只会发布左上角的面板。

我知道这不是一种显示数据的特别好方法 - 但这个决定并不取决于我。

样本数据集如下:

my.data <- as.data.frame(rbind( cbind( rnorm(1e3), 1) , cbind( rnorm(1e3)+2, 2), cbind( rnorm(1e3)+3, 3), cbind( rnorm(1e3)+4, 4)))

我可以用geom_histogram绘制它,如下所示:

ggplot(my.data) + geom_histogram(aes(x=V1,fill=as.factor(V2))) + facet_grid( V2~.)

但是我希望y轴重叠。

5 个答案:

答案 0 :(得分:9)

require(ggplot2)
require(plyr)

my.data <- as.data.frame(rbind( cbind( rnorm(1e3), 1) , cbind(     rnorm(1e3)+2, 2), cbind( rnorm(1e3)+3, 3), cbind( rnorm(1e3)+4, 4)))
my.data$V2=as.factor(my.data$V2)

根据V2计算密度

res <- dlply(my.data, .(V2), function(x) density(x$V1))
dd <- ldply(res, function(z){
  data.frame(Values = z[["x"]], 
             V1_density = z[["y"]],
             V1_count = z[["y"]]*z[["n"]])
})

根据V2

添加偏移量
dd$offest=-as.numeric(dd$V2)*0.2 # adapt the 0.2 value as you need
dd$V1_density_offest=dd$V1_density+dd$offest

和情节

ggplot(dd, aes(Values, V1_density_offest, color=V2)) + 
  geom_line()+
  geom_ribbon(aes(Values, ymin=offest,ymax=V1_density_offest,     fill=V2),alpha=0.3)+
  scale_y_continuous(breaks=NULL)

results

答案 1 :(得分:2)

来自bioconductor densityplot()包的

flowViz是堆叠密度的一种选择。

来自:http://www.bioconductor.org/packages/release/bioc/manuals/flowViz/man/flowViz.pdf

  

对于flowSet,我们的想法是水平堆叠所有帧的密度估计图   flowSet用于一个或多个流动参数。在后一种情况下,将绘制每个参数   在一个单独的小组中,即我们暗示了参数。

您可以在此处查看示例视觉效果: http://www.bioconductor.org/packages/release/bioc/vignettes/flowViz/inst/doc/filters.html

source("http://bioconductor.org/biocLite.R")
biocLite("flowViz")

答案 2 :(得分:1)

我认为很难让ggplot像这样偏移直方图。至少在制作新面板的过程中,实际上,这种转变使得y轴无意义。 (该值在行与行的比较中)。这是尝试使用基础图形尝试完成类似事情的一次尝试。

#plotting function
plotoffsethists <- function(vals, groups, freq=F, overlap=.25, alpha=.75, colors=apply(floor(rbind(col2rgb(scales:::hue_pal(h = c(0, 360) + 15, c = 100, l = 65)(nlevels(groups))),alpha=alpha*255)),2,function(x) {paste0("#",paste(sprintf("%02X",x),collapse=""))}), ...) {
    print(colors)
    if (!is.factor(groups)) {
        groups<-factor(groups)
    }
    offsethist <- function (x, col = NULL, offset=0, freq=F, ...) {
        y <- if (freq) y <- x$counts
        else 
            x$density
        nB <- length(x$breaks)
        rect(x$breaks[-nB], 0+offset, x$breaks[-1L], y+offset, col = col, ...)
    }

     hh<-tapply(vals, groups, hist, plot=F)

    ymax<-if(freq)
        sapply(hh, function(x) max(x$counts))
    else
        sapply(hh, function(x) max(x$density))
    offset<-(mean(ymax)*overlap) * (length(ymax)-1):0
    ylim<-range(c(0,ymax+offset))
    xlim<-range(sapply(hh, function(x) range(x$breaks)))
    plot.new()
    plot.window(xlim, ylim, "")
    box()
    axis(1)

    Map(offsethist, hh, colors, offset, freq=freq, ...)
    invisible(hh)
}

#sample call
par(mar=c(3,1,1,1)+.1)
plotoffsethists(my.data$V1, factor(my.data$V2), overlap=.25)

plotoffsethists example

答案 3 :(得分:1)

使用ggridges软件包:

ggplot(my.data, aes(x = V1, y = factor(V2), fill = factor(V2), color = factor(V2))) +
  geom_density_ridges(alpha = 0.5)

enter image description here

答案 4 :(得分:1)

作为Axeman答案的补充,您可以将选项stat="binline"添加到geom_density_ridges图形中。这样会得到类似直方图的图,而不是密度线。

library(ggplot2)
library(ggridges)

my.data <- as.data.frame(rbind( cbind( rnorm(1e3), 1) , 
                                cbind( rnorm(1e3)+2, 2), 
                                cbind( rnorm(1e3)+3, 3), 
                                cbind( rnorm(1e3)+4, 4)))
my.data$V2 <- as.factor(my.data$V2)
ggplot(my.data, aes(x=V1, y=factor(V2),  fill=factor(V2))) +
      geom_density_ridges(alpha=0.6, stat="binline", bins=30)

结果图像: resulting image (as i cannot yet post images here)