首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R-减去两个smoothScatter图

R-减去两个smoothScatter图
EN

Stack Overflow用户
提问于 2014-05-13 01:43:59
回答 1查看 2.5K关注 0票数 7

我有两个smoothScatter图,希望能减去它们。见下文:

代码语言:javascript
运行
复制
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")))

我希望我能制作出第三幅图,这是第二幅图中第一幅图的彩色减法。也就是说,有些区域是蓝色的,红色的,如果可能的话,我想把重叠的区域变成灰色的。但我希望颜色与新的密度一致。例如,新地块的中心几乎完全是灰色的,而外面可能有一些灰色,但也有一些蓝色和红色。请注意,这两幅图有不同的点数。我怎么能做这种事?

我能想到的唯一办法就是逐像素地把颜色从一个点减到另一个点。问题是,我不知道如何获取每个像素的颜色强度来做到这一点。然而,即使我要做到这一点,白色减白色可能会给黑色,这是我不想。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-13 05:50:46

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

代码语言:javascript
运行
复制
#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="")}

然后我们就可以用

代码语言:javascript
运行
复制
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种颜色中找到一个值。这有点疯狂,但是您可以将源代码读入smoothScatterimage.default,看看它是如何发生的。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23621571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档