我有两个smoothScatter情节,希望减去它们.见下文:
par(mfrow=c(1,2))
set.seed(3)
x1 = rnorm(1000)
y1 = rnorm(1000)
smoothScatter(x1,y1,nrpoints=length(x1),cex=3)
x2 = rnorm(200)
y2 = rnorm(200)
smoothScatter(x2,y2,nrpoints=length(x2),cex=3,colramp=colorRampPalette(c("white","red")))
Run Code Online (Sandbox Code Playgroud)
我的希望是我可以制作第3个图,这是第2个图中第1个图的彩色减法.也就是说,会有一些区域是蓝色,红色,然后如果可能的话我想让重叠区域变灰.但我希望颜色与新的密度一致.例如,新地块的中心几乎是完全灰色的,而外部可能有一些灰色,但也有蓝色和红色的斑块.请注意,这两个图具有不同的点数.我怎么能做这样的事情?
我能想到这样做的唯一方法是逐个像素地将颜色从一个绘图减去另一个绘图.问题是,我不知道如何抓住每个像素的颜色强度来做到这一点.然而,即使我要实现这一点,白色减去白色也可能会产生黑色,这是我不想要的.
提前致谢!
MrF*_*ick 10
您可以考虑使用略微透明的颜色
#helper function to make transparent ramps
alpharamp<-function(c1,c2, alpha=128) {stopifnot(alpha>=0 & alpha<=256);function(n) paste(colorRampPalette(c(c1,c2))(n), format(as.hexmode(alpha), upper.case=T), sep="")}
Run Code Online (Sandbox Code Playgroud)
然后我们可以用两个图表来绘制
smoothScatter(x1,y1,nrpoints=length(x1),cex=3, colramp=alpharamp("white",blues9))
par(new=T)
smoothScatter(x2,y2,nrpoints=length(x2),cex=3,colramp= alpharamp("white","red"), axes=F, ann=F)
Run Code Online (Sandbox Code Playgroud)
这是代码生成的.

如果,你仍然想要获得图中的实际颜色值,那实际上有点棘手.您必须grDevices:::.smoothScatterCalcDensity直接拨打您的数据.然后你必须fhat通过取第4个根并重新缩放到0-1 来转换返回的值.然后通过获取这些值然后转换为颜色然后z使用公式将这些值转换为索引floor((256 - 1e-05) * z + 1e-07)+1.然后这些索引用于从您提供的斜坡生成的256种颜色中查找值.这有点疯狂但你可以阅读源代码smoothScatter并image.default了解它是如何发生的.