如何叠加两个密集的散点图,以便我可以在R或Matlab中看到每个散点图的轮廓?

时间:2012-03-14 17:18:59

标签: r matlab plot ggplot2 plyr

请参阅此示例Example of overlaid scatter plots

这是在matlab中创建的,它通过独立制作两个散点图,创建每个散点图,然后使用imagesc将它们绘制到同一个图中,然后最终将顶部图像的alpha设置为0.5。

我想在不使用图像的情况下在R或matlab中执行此操作,因为创建图像不会保留轴刻度信息,也不能覆盖网格(例如,在matlab中使用'grid on')。理想情况下,我想在matlab中正确地做到这一点,但也会对R中的解决方案感到满意。看起来它应该是可能的,但我不能为我的生活弄明白。

所以一般来说,我希望能够设置整个绘图对象的alpha值(即matlab用法中的matlab绘图句柄...)

谢谢,

本。

编辑:上例中的数据实际上是2D。绘制的点来自计算机模拟。每个点代表“振幅”(y轴)(特定于我正在运行的模拟的紧急属性),针对“性能”(x轴)绘制。

编辑2:每个数据集中有1796400个点。

4 个答案:

答案 0 :(得分:11)

使用ggplot2,您可以将两个geom_point加在一起,并使用alpha参数使其透明。 ggplot2 als增加了透明度,我认为这就是你想要的。这应该有用,虽然我没有运行它。

dat = data.frame(x = runif(1000), y = runif(1000), cat = rep(c("A","B"), each = 500))
ggplot(aes(x = x, y = y, color = cat), data = dat) + geom_point(alpha = 0.3)

ggplot2太棒了!

这是计算和绘制凸包的一个例子:

library(automap)
library(ggplot2)
library(plyr)
loadMeuse()
theme_set(theme_bw())

meuse = as.data.frame(meuse)
chull_per_soil = ddply(meuse, .(soil), 
           function(sub) sub[chull(sub$x, sub$y),c("x","y")])

ggplot(aes(x = x, y = y), data = meuse) +
  geom_point(aes(size = log(zinc), color = ffreq)) +
  geom_polygon(aes(color = soil), data = chull_per_soil, fill = NA) +
  coord_equal()

导致以下插图:

enter image description here

答案 1 :(得分:5)

您可以先将两个数据集导出为位图图像,然后重新导入它们,添加透明度:

overlay

library(grid)

N <- 1e7 # Warning: slow
d <- data.frame(x1=rnorm(N),
                x2=rnorm(N, 0.8, 0.9),
                y=rnorm(N, 0.8, 0.2),
                z=rnorm(N, 0.2, 0.4))

v <- with(d, dataViewport(c(x1,x2),c(y, z)))

png("layer1.png", bg="transparent")
with(d, grid.points(x1,y, vp=v,default="native",pch=".",gp=gpar(col="blue")))
dev.off()
png("layer2.png", bg="transparent")
with(d, grid.points(x2,z, vp=v,default="native",pch=".",gp=gpar(col="red")))
dev.off()

library(png)
i1 <- readPNG("layer1.png", native=FALSE)
i2 <- readPNG("layer2.png", native=FALSE)

ghostize <- function(r, alpha=0.5)
  matrix(adjustcolor(rgb(r[,,1],r[,,2],r[,,3],r[,,4]), alpha.f=alpha), nrow=dim(r)[1])

grid.newpage()
grid.rect(gp=gpar(fill="white"))
grid.raster(ghostize(i1))
grid.raster(ghostize(i2))

您可以将这些作为图层添加到ggplot2

答案 2 :(得分:0)

使用颜色描述的透明度功能。您可以将颜色定义为四个2字节单词的序列:muddy <- "#888888FF"。前三对设置RGB颜色(00到FF);最后一对设置透明度级别。

答案 3 :(得分:0)

AFAIK,Matlab的最佳选择就是制作自己的情节功能。遗憾的是,散点图点尚未具有透明度属性,因此您无法对其进行影响。但是,如果你创造了一些粗略地创建了许多小圆圈的循环,那么你可以很容易地给它们一个alpha值并获得一组透明的数据点。