【问题标题】:In R, is it possible to overlay 2 colours in a plot to make a 3rd (e.g. with additive or subtractive colour mixing)在 R 中,是否可以在绘图中叠加 2 种颜色以制作第 3 种颜色(例如,使用加色或减色混合)
【发布时间】:2012-01-06 08:54:52
【问题描述】:

我想做一个包含 2 类数据的散点图,一类以黄色绘制,一类以蓝色绘制,它们在重叠的位置以绿色显示(或任何其他组合)。我发现即使有透明度,事情也会变得更加困难。图表的颜色受空间中最后绘制的点是蓝色还是黄色的影响。

例如下面的代码:

col1 <- rgb(red = .0, green = 0, blue = 0.8, alpha = 0.8)
col2 <- rgb(red = .8, green = 0.8, blue = 0, alpha = 0.8)
circle <- data.frame(x = c(0.2,0), 
                    y = c(0,0),
                    col = c(col1, col2),
                    stringsAsFactors = F)
orders <- c(1,2)
plot(x = circle$x[orders], y = circle$y[orders],
     col = circle$col[orders], pch = 19, cex = 100, xlab = "", ylab = "")

根据您设置矢量orders 的方式(设置两个大点的绘制方式),您会得到不同的结果:

如果你交换绘制两个圆圈的顺序,你会得到:

无论哪种方式,我都期待混合颜色以获得绿色。有没有办法做到这一点?谢谢!

编辑 - 这两个图是使用 pdf 设备制作的。我也尝试通过 tikzDevice 运行代码,看看是否有效,但没有。

【问题讨论】:

  • colorspace 有一个函数mixcolor 将计算这种混合颜色的值:cran.r-project.org/web/packages/colorspace/colorspace.pdf。我不知道直接这样做的方法 - 我对这个问题的解决方案是找到一种不同的可视化数据的方法,例如使用hexbin,使用facets 或计算每个点的净得分。
  • 这不是一个真正的答案,但你可以看看en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending——我假设不同的设备(PDF、tikzDevice、PNG 等)都在使用这个算法的变体来确定重叠的颜色,它可能会帮助您了解正在发生的事情。
  • 特别是,我从研究这些公式中发现 alpha 混合不是可交换的(事实上,正如文章指出的那样,在某些情况下它也不是关联的,尽管在这里没关系,因为您只组合了两种颜色)-这解释了上面的“订单很重要”结果。
  • 我刚刚在 postscript() 设备上尝试了这个,圆圈没有重叠!这就是使用 cex 并且没有适当的设备大小所得到的......增加 cex 可以解决它。无论如何,postscript 设备不能处理透明度,只能叠印。嗯。我认为不可能(很容易)。
  • 前段时间在 R-help 上也讨论过这个问题,R-core 成员做出了有趣的贡献:mail-archive.com/r-help@r-project.org/msg83970.html

标签: r graphics colors rgb


【解决方案1】:

pdf() 设备的帮助文件说背景的默认设置是“透明的”,尽管在实践中这似乎不是它的行为,可能是因为查看者假定为白色背景,或者可能是因为默认设置为情节功能是“白色”。中间部分 first 变成白色和绿色的等量混合颜色,第二个 second 然后添加蓝色。所以我猜测数学会预测 (0.5, 0.5, (0.5+0.8)/2 ) 的 rgb 值,然后将该混合物与覆盖的颜色混合,我认为 white+col1 以相等的比例添加到col2 中的值使数学不可交换。无论如何,如果您可以强制背景“透明”,最终结果可能会有所不同。默认行为更像是混合颜料,而不是闪亮的剧院灯光。

http://www.adobe.com/devnet/pdf/pdf_reference.html 中描述了 PDF 颜色模型,它将确定您对 pdf 设备的期望(但不一定是查看器将提供的)。

我通过将背景更改为“黑色”来测试我的理论,即白色背景是问题所在(并且似乎已经证明了这一点),希望分层 rgb 向量不会有附加值:

pdf("testfil12rev.pdf", bg="black")
 col1 <- rgb(red = .0, green = 0, blue = 1, alpha = 0.5)
 col2 <- rgb(red = 1, green = 0, blue = 0, alpha = 0.5)
 circle <- data.frame(x = c(0.2,0), 
                     y = c(0,0),
                     col = c(col1, col2),
                     stringsAsFactors = F)
 orders <- c(1,2)
plot(x = circle$x[orders], y = circle$y[orders], bg="black",
      col = circle$col[orders], pch = 19, cex = 100, xlab = "", ylab = "")

 dev.off()

反转“订单”指示符也不会产生与黑色背景相同的混合颜色。

编辑:之前有一个 SO 发布,其中包含混合颜色和 alpha 的规则:How to calculate an RGB colour by specifying an alpha blending amount?

【讨论】:

  • 感谢您的参考。我会尝试使用透明设置。
  • 我尝试了透明设置 (png("tmp.png", bg="transparent")),它确实改变了一些事情(并且可能会通过删除一个因素来帮助任何探索),但结果仍然是不可交换的并且仍然不对应如上所述的天真期望(蓝色+黄色=绿色)。
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多