R - 减去两个smoothScatter 图

标签 r plot heatmap

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

enter image description here
我的希望是我可以制作第三个情节,这是从第二个情节中减去第一个情节的彩色减法。也就是说,会有蓝色、红色的区域,然后如果可能的话我想让重叠的区域变成灰色。但我希望颜色与新密度一致。例如,新图的中心几乎完全是灰色的,而外部可能有一些灰色,但也有蓝色和红色的斑块。请注意,这两个图具有不同的点数。我怎么能做这种事?

我能想到的唯一方法是逐个像素地处理并将颜色从一个图减去另一个图。问题是,我不知道如何获取每个像素的颜色强度来做到这一点。但是,即使我要实现这一点,白色减去白色可能会产生黑色,这是我不想要的。

提前致谢!

最佳答案

您可以考虑使用稍微透明的颜色

#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)

这是这段代码产生的。

sample plot with transparency

如果您仍然想获得图中的实际颜色值,那实际上有点棘手。您必须调用 grDevices:::.smoothScatterCalcDensity直接使用您的数据。然后你必须转换返回的 fhat通过取第 4 个根并重新缩放到 0-1 来计算值。然后您通过获取这些值转换为颜色,然后这些值(​​让我们称它们为 z 使用公式 floor((256 - 1e-05) * z + 1e-07)+1 转换为索引。然后这些索引用于从您提供的渐变生成的 256 种颜色中找到一个值. 这有点疯狂,但您可以阅读 smoothScatterimage.default 的源代码,看看它是如何发生的。

关于R - 减去两个smoothScatter 图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23621571/

相关文章:

javascript - Django 使用plotly 和表单中的数据绘制图表

python - 如何为seaborn热图中的值分配颜色

r - 在 ggplot2 中创建华夫饼图

r - 相当于 purrr::map_df 中的 next

r - 创建一个没有元素与原始向量位于相同位置的新向量?

r - 如何使用 R 获取图中的行和列的总和

python - 用 Python 绘制 Highcharts 图

r - 将时间序列绘制为热图

r - 加入树状图和热图

r - 在 R 中正确绘制大型邻接矩阵