2013-06-28 36 views
18

如何用alpha透明散点图,可以在R中制作无标度直方图,如图所示?散点图与R中的alpha透明直方图

看起来好像不是在ggplot2中制作的。 enter image description here

有谁知道使用了什么命令?

+0

该线程被关闭,但可能不太想要的位置是:http://stackoverflow.com/questions/8545035/scatterplot-with-marginal-histograms-in- ggplot2 –

+1

参见http://blog.mckuhn.de/2009/09/learning-ggplot2-2d-plot-with.html –

回答

33
library(ggplot2) 
library(gridExtra) 

set.seed(42) 
DF <- data.frame(x=rnorm(100,mean=c(1,5)),y=rlnorm(100,meanlog=c(8,6)),group=1:2) 

p1 <- ggplot(DF,aes(x=x,y=y,colour=factor(group))) + geom_point() + 
    scale_x_continuous(expand=c(0.02,0)) + 
    scale_y_continuous(expand=c(0.02,0)) + 
    theme_bw() + 
    theme(legend.position="none",plot.margin=unit(c(0,0,0,0),"points")) 

theme0 <- function(...) theme(legend.position = "none", 
           panel.background = element_blank(), 
           panel.grid.major = element_blank(), 
           panel.grid.minor = element_blank(), 
           panel.margin = unit(0,"null"), 
           axis.ticks = element_blank(), 
           axis.text.x = element_blank(), 
           axis.text.y = element_blank(), 
           axis.title.x = element_blank(), 
           axis.title.y = element_blank(), 
           axis.ticks.length = unit(0,"null"), 
           axis.ticks.margin = unit(0,"null"), 
           panel.border=element_rect(color=NA),...) 

p2 <- ggplot(DF,aes(x=x,colour=factor(group),fill=factor(group))) + 
    geom_density(alpha=0.5) + 
    scale_x_continuous(breaks=NULL,expand=c(0.02,0)) + 
    scale_y_continuous(breaks=NULL,expand=c(0.02,0)) + 
    theme_bw() + 
    theme0(plot.margin = unit(c(1,0,0,2.2),"lines")) 

p3 <- ggplot(DF,aes(x=y,colour=factor(group),fill=factor(group))) + 
    geom_density(alpha=0.5) + 
    coord_flip() + 
    scale_x_continuous(labels = NULL,breaks=NULL,expand=c(0.02,0)) + 
    scale_y_continuous(labels = NULL,breaks=NULL,expand=c(0.02,0)) + 
    theme_bw() + 
    theme0(plot.margin = unit(c(0,1,1.2,0),"lines")) 

grid.arrange(arrangeGrob(p2,ncol=2,widths=c(3,1)), 
      arrangeGrob(p1,p3,ncol=2,widths=c(3,1)), 
      heights=c(1,3)) 

enter image description here

编辑:

我无法找出是什么原因导致下面的密度geoms的空间。你可以摆弄剧情边缘来避开它,但我不太喜欢那个。

p2 <- ggplot(DF,aes(x=x,colour=factor(group),fill=factor(group))) + 
    geom_density(alpha=0.5) + 
    scale_x_continuous(breaks=NULL,expand=c(0.02,0)) + 
    scale_y_continuous(breaks=NULL,expand=c(0.00,0)) + 
    theme_bw() + 
    theme0(plot.margin = unit(c(1,0,-0.48,2.2),"lines")) 

p3 <- ggplot(DF,aes(x=y,colour=factor(group),fill=factor(group))) + 
    geom_density(alpha=0.5) + 
    coord_flip() + 
    scale_x_continuous(labels = NULL,breaks=NULL,expand=c(0.02,0)) + 
    scale_y_continuous(labels = NULL,breaks=NULL,expand=c(0.00,0)) + 
    theme_bw() + 
    theme0(plot.margin = unit(c(0,1,1.2,-0.48),"lines")) 

enter image description here

+0

非常好!你怎么能让密度图更接近轴线,以便它们像原始图中那样触摸图的边界框? – user248237dfsf

0

我不知道是否有一个包直接做,但我确定这可以在R.完成。透明度很容易:你添加另一个两位数的颜色的RGB规范的一个给定透明度:

#FF0000 # red 
#FF0000FF # full opacity 
#FF000000 # full transparency 

使用layout函数也可以轻松地组合不同的图。至于垂直密度图,它与切换x和y的水平图相同。给出的例子here可以很容易地扩展为包括颜色,较小的边距等。如果这种描述不够充分,我可以尝试提出一个更详细的例子。