我试图使用ggplot或base R来生成如下内容:
我知道如何用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轴重叠。
答案 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)
答案 1 :(得分:2)
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)
答案 3 :(得分:1)
使用ggridges
软件包:
ggplot(my.data, aes(x = V1, y = factor(V2), fill = factor(V2), color = factor(V2))) +
geom_density_ridges(alpha = 0.5)
答案 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)
结果图像: