我有来自两个类别的2D数据的散点图.我想为每个维度添加密度线 - 不是在图表之外(参见ggplot2中带有边缘直方图的散点图),而是在绘图表面上.我可以为x轴维度得到这个,如下所示:
set.seed(123)
dim1 <- c(rnorm(100, mean=1), rnorm(100, mean=4))
dim2 <- rnorm(200, mean=1)
cat <- factor(c(rep("a", 100), rep("b", 100)))
mydf <- data.frame(cbind(dim2, dim1, cat))
ggplot(data=mydf, aes(x=dim1, y=dim2, colour=as.factor(cat))) +
geom_point() +
stat_density(aes(x=dim1, y=(-2+(..scaled..))),
position="identity", geom="line")
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:

但我想要一对垂直运行的类似密度曲线,显示y维中点的分布.我试过了
stat_density(aes(y=dim2, x=0+(..scaled..))), position="identity", geom="line)
Run Code Online (Sandbox Code Playgroud)
但收到错误"stat_density需要以下缺少美学:x".
有任何想法吗?谢谢
您可以获得dim2变量的密度.然后,翻转轴并将它们存储在新的data.frame中.之后,它只是将它们绘制在另一个图形的顶部.
p <- ggplot(data=mydf, aes(x=dim1, y=dim2, colour=as.factor(cat))) +
geom_point() +
stat_density(aes(x=dim1, y=(-2+(..scaled..))),
position="identity", geom="line")
stuff <- ggplot_build(p)
xrange <- stuff[[2]]$ranges[[1]]$x.range # extract the x range, to make the new densities align with y-axis
## Get densities of dim2
ds <- do.call(rbind, lapply(unique(mydf$cat), function(lev) {
dens <- with(mydf, density(dim2[cat==lev]))
data.frame(x=dens$y+xrange[1], y=dens$x, cat=lev)
}))
p + geom_path(data=ds, aes(x=x, y=y, color=factor(cat)))
Run Code Online (Sandbox Code Playgroud)
