我有两个 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")))
我的希望是我可以制作第三个情节,这是从第二个情节中减去第一个情节的彩色减法。也就是说,会有蓝色、红色的区域,然后如果可能的话我想让重叠的区域变成灰色。但我希望颜色与新密度一致。例如,新图的中心几乎完全是灰色的,而外部可能有一些灰色,但也有蓝色和红色的斑块。请注意,这两个图具有不同的点数。我怎么能做这种事?
我能想到的唯一方法是逐个像素地处理并将颜色从一个图减去另一个图。问题是,我不知道如何获取每个像素的颜色强度来做到这一点。但是,即使我要实现这一点,白色减去白色可能会产生黑色,这是我不想要的。
提前致谢!
最佳答案
您可以考虑使用稍微透明的颜色
#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
的源代码,看看它是如何发生的。
关于R - 减去两个smoothScatter 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23621571/