我有两个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")))

我希望我能制作出第三幅图,这是第二幅图中第一幅图的彩色减法。也就是说,有些区域是蓝色的,红色的,如果可能的话,我想把重叠的区域变成灰色的。但我希望颜色与新的密度一致。例如,新地块的中心几乎完全是灰色的,而外面可能有一些灰色,但也有一些蓝色和红色。请注意,这两幅图有不同的点数。我怎么能做这种事?
我能想到的唯一办法就是逐像素地把颜色从一个点减到另一个点。问题是,我不知道如何获取每个像素的颜色强度来做到这一点。然而,即使我要做到这一点,白色减白色可能会给黑色,这是我不想。
提前感谢!
发布于 2014-05-13 05:50:46
您可以考虑使用稍微透明的颜色。
#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="")}然后我们就可以用
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)这是这段代码产生的。

如果你仍然想得到图中的实际颜色值,那实际上有点棘手。您必须使用您的数据直接调用grDevices:::.smoothScatterCalcDensity。然后,您必须转换返回的fhat值,方法是获取第4个根并将其重新标度为0-1。然后将这些值转换为颜色,然后将这些值(我们称之为z )转换为使用公式floor((256 - 1e-05) * z + 1e-07)+1的索引。然后,这些索引用于从您提供的斜坡生成的256种颜色中找到一个值。这有点疯狂,但是您可以将源代码读入smoothScatter和image.default,看看它是如何发生的。
https://stackoverflow.com/questions/23621571
复制相似问题