随机生成3种不同的颜色

时间:2017-04-14 23:04:43

标签: r colors rgb color-scheme hsv

我看过this one,但对随机部分没有帮助。是否有更好的方法可以随机生成3种不同的颜色,以便方形,圆形和文本在下面的代码中彼此可视。颜色必须随机生成,并且彼此之间也应足够明显。当前代码的工作时间可能只有一半

plot(0, type = "n", xlim = c(0,10), ylim = c(0,10),
    ann = FALSE, axes = FALSE, asp = 1)

cols = colorRampPalette(sample(2:9,2), alpha = TRUE)(8)

polygon(x = c(1,9,9,1), y = c(1,1,9,9), border = NA, col = cols[1])

symbols(x = 5, y = 5, circles = 4, inches = FALSE,
    add = TRUE, bg = cols[4], fg = NA)

text(x = 5, y = 5, labels = "Hi", col = cols[7], font = 2, cex = 3)

实施例

不可

enter image description here

POLYGON:“#FF00FFFF”,CIRCLE:“#916DFFFF”,文字:“#24DAFFFF”

BAD

enter image description here

POLYGON:“#00FFFFFF”,CIRCLE:“#51E3E3FF”,文字:“#A2C7C7FF”

2 个答案:

答案 0 :(得分:4)

更新答案

我使用hcl色彩空间的原始答案通常会生成难以区分的颜色组合。此更新的答案使用Lab颜色空间,该颜色空间根据颜色之间的感知距离进行缩放,因此Lab空间中的相似距离应对应于相似的感知颜色差异。在Lab中, L 是亮度或亮度,范围为0到100. a 表示绿色到红色, b 表示蓝色到黄色,两者都在-100到100的范围内。

以下代码为ab生成两个随机值。如果我们将这两个值视为代表ab平面中的一个点,我们通过将该点首先旋转120度然后旋转240度来生成两个具有彼此最大感知距离的颜色。然后我们选择单个L值给我们三种等间距的颜色。

下面我将其打包成一个函数,以便轻松生成多个随机颜色的图。我还为a和b设置了最小绝对值,这样我们就不会得到太相似的颜色,并且包含Lval参数来选择Lab颜色的L值。

基于几次运行,看起来这种方法比我原来的hcl版本表现要好得多(虽然这可能不仅仅是因为使用Lab空间而不是hcl空间,而且因为我只使用了一个维度hcl空间,但Lab空间的两个维度)。

library(colorspace)

random.colors = function(Lval=80, ABmin=50) {

  # 120 deg rotation matrix
  aa = 2*pi/3
  rot = matrix(c(cos(aa), -sin(aa), sin(aa), cos(aa)), nrow=2, byrow=TRUE)

  # Generate random A and B points in LAB space
  x = runif(2, ABmin, 100) * sample(c(-1,1), 2,replace=TRUE) 

  # Create three equally spaced colors in Lab space and convert to RGB
  cols = LAB(cbind(rep(Lval,3), rbind(x, x %*% rot, x %*% rot %*% rot)))
  cols = rgb(convertColor(cols@coords, from="Lab", to="sRGB"))

  plot(0, type = "n", xlim = c(0,10), ylim = c(0,10),
       ann = FALSE, axes = FALSE, asp = 1)

  polygon(x = c(1,9,9,1), y = c(1,1,9,9), border = NA, col = cols[1])

  symbols(x = 5, y = 5, circles = 4, inches = FALSE,
          add = TRUE, bg = cols[2], fg = NA)

  text(x = 5, y = 5, labels = "Hi", col = cols[3], font = 2, cex = 3)
}

par(mfrow=c(3,3), mar=rep(0,4))
replicate(9,random.colors())  

enter image description here

为简单起见,上面的示例将a和b值约束为距原点(在ab空间中)的恒定距离,并对所有三种颜色使用相同的L值。您可以改为扩展此方法以使用Lab空间的所有三个维度。此外,您可以随机选择第一种颜色,然后选择接下来的两种颜色,使得所有三种颜色在Lab空间中最大程度地相互分离。

,而不是要求与原点保持恒定距离。

原始答案

您可以生成在色调维度上等间距的颜色(即,彼此具有最大可能的色调分离)。例如:

set.seed(60)
cols = hcl(runif(1,0,359.99) + c(0,120,240), 100, 65)

plot(0, type = "n", xlim = c(0,10), ylim = c(0,10),
     ann = FALSE, axes = FALSE, asp = 1)

polygon(x = c(1,9,9,1), y = c(1,1,9,9), border = NA, col = cols[1])

symbols(x = 5, y = 5, circles = 4, inches = FALSE,
        add = TRUE, bg = cols[2], fg = NA)

text(x = 5, y = 5, labels = "Hi", col = cols[3], font = 2, cex = 3)

enter image description here

这里有九个随机抽奖。如您所见,有些组合效果不佳。但也许你可以用不同的方式来分割色彩空间,看看你能不能做得更好。

enter image description here

答案 1 :(得分:2)

一种超级简单的方法是在八种“标准”颜色中进行采样。

par(mar=c(0, 0, 0, 0))
set.seed(1)
plot(0, type = "n", xlim = c(0,10), ylim = c(0,10),
    ann = FALSE, axes = FALSE, asp = 1)

cols <- sample(2:8, 3)

polygon(x = c(1,9,9,1), y = c(1,1,9,9), border = NA, col = cols[1])

symbols(x = 5, y = 5, circles = 4, inches = FALSE,
    add = TRUE, bg = cols[2], fg = NA)

text(x = 5, y = 5, labels = "Hi", col = cols[3], font = 2, cex = 3)

enter image description here