如何计算R中多维颜色的渐变

时间:2014-10-26 09:15:58

标签: r graphics colors ggplot2 palette

这与this question有关,但也许是一个更简单的例子。我很好奇是否有合理的方法来计算三维或四种任意颜色的多维颜色渐变,就像r rgb()函数用红色,绿色,蓝色那样?一维梯度很容易(图1)但是我不清楚如何计算三角形内的二维梯度(图2)。边缘很容易。它内在的重要性

# one dimensional color gradient
one.dimensions <- colorRampPalette( c( "orange" , "blue" ) )( 100 )

plot( 1:100 , rep( 1 , 100 ) , col = one.dimensions , cex = 3 , pch = 16 , main  = 'one dimensional gradient' )

enter image description here

# here are the edges of a three-colored triangle
dimensions13 <- colorRampPalette( c( "orange" , "blue" ) )( 100 )
dimensions12 <- colorRampPalette( c( "orange" , "red" ) )( 100 )
dimensions23 <- colorRampPalette( c( "blue" , "red" ) )( 100 )

plot( 1:100 , c( 1:50 , 50:1 ) , type = 'n' , main = 'two dimensional gradient' )
points( 1:100 , rep( 1 , 100 ) , col = dimensions12 , cex = 3 , pch = 16 )
points( seq( 1 , 50 , length = 100 ) , seq( 1 , 50 , length = 100 ) , col = dimensions13 , cex = 3 , pch = 16 )
points( seq( 50 , 100 , length = 100 ) , seq( 50 , 1 , length = 100 ) , col = dimensions23 , cex = 3 , pch = 16 )

enter image description here

1 个答案:

答案 0 :(得分:3)

你可以考虑三种基本的混色策略:

1-减法,使用R图形的Alpha透明度混合。基本上,使用自己的渐变叠加多个图层。

library(grid)

grid.newpage()
grid.raster(scales::alpha(colorRampPalette(c("white","blue"))(10), 0.3),
            width=1,height=1)
grid.raster(t(scales::alpha(colorRampPalette(c("white","red"))(10), 0.3)),
            width=1,height=1)

一个缺点是最终颜色取决于层的顺序。

enter image description here

CMYK colour model可能是另一个灵感来源。

2-添加剂。我想出了一个天真的实现,如下所示。考虑你的N种基本颜色(比如黄色,绿色,橙色)。为它们分配可见光谱的波长(570nm,520nm,600nm)。根据三角形中的位置给出每种颜色的重量(考虑具有可调强度的N种激光)。现在要获得与这种N激光源混合相关的颜色,您需要与CIE colour matching functions进行卷积。这是一种物理混音,将数字映射到视觉感知。然而,显然存在一个独特性的问题:几种组合可能会产生相同的颜色。毕竟眼睛只有三种不同类型的受体,因此N> 3永远不会导致双射。

3-像素化(halftoning)。将图像分成小的相邻区域,如LCD屏幕,每个像素被分成N个子像素,每个子像素都有自己的颜色。从远处和/或足够的屏幕/打印分辨率,眼睛将看不到细节,并会为您模糊相邻的颜色。