我有两个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")))
我的希望是我可以制作第3个图,这是第2个图中第1个图的彩色减法。也就是说,会有一些区域是蓝色,红色,然后如果可能的话我想让重叠区域变灰。但我希望颜色与新的密度一致。例如,新地块的中心几乎是完全灰色的,而外部可能有一些灰色,但也有蓝色和红色的斑块。请注意,这两个图具有不同的点数。我怎么能做这样的事情?
我能想到的唯一方法是逐个像素地将颜色从一个绘图中减去另一个绘图。问题是,我不知道如何抓住每个像素的颜色强度来做到这一点。然而,即使我要实现这一目标,白色减去白色也可能会产生黑色,这是我不想要的。
提前致谢!
答案 0 :(得分: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="")}
然后我们可以用
绘制两个图形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
。然后,您必须通过取第4个根并重新缩放到0-1来转换返回的fhat
值。然后通过获取这些值然后转换为颜色,然后使用公式z
将这些值floor((256 - 1e-05) * z + 1e-07)+1
转换为索引。然后这些索引用于从中查找值从您提供的斜坡生成256种颜色。它有点疯狂,但您可以阅读smoothScatter
和image.default
的来源,看看它是如何发生的。