首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机生成三种不同的颜色

问随机生成三种不同的颜色
EN

Stack Overflow用户
提问于 2017-04-14 23:04:43
回答 2查看 1.5K关注 0票数 4

我看过this one,但对随机部分没有帮助。是否有更好的方法随机生成3种不同的颜色,以使正方形、圆圈和文本在下面的代码中相互突出。这些颜色必须是随机产生的,而且彼此之间也有足够的区别。当前代码的工作时间可能只有一半。

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

示例

好

​

​

多边形:"#FF00FFFF",圆圈:“#916 CIRCLE”,正文:“#24 24DAFFFF”

BAD

​

​

多边形:"#00FFFFFF",圆圈:"#51E3E3FF",文字:#A2C7C7FF

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-14 23:21:35

我最初的答案,即使用hcl颜色空间,经常生成难以区分的颜色组合。这个更新后的答案使用了Lab颜色空间,该空间根据颜色之间的感知距离进行缩放,因此在Lab空间中的相似距离应该对应于相似的感知颜色差异。在实验室里,L是0到100的亮度或亮度。A代表绿色到红色,b代表蓝色到黄色,两者都在-100到100之间。

下面的代码为a和b生成两个随机值。如果我们认为这两个值代表了ab平面上的一个点,我们会通过先旋转120度,然后再旋转240度,以最大的感知距离产生两种颜色。然后我们选择一个L值来给出三个等距的颜色。

下面我把它打包成一个函数,这样就可以很容易地生成几个随机颜色的情节。我还为a和b设置了一个最小绝对值,这样我们就不会得到太相似的颜色,并包含了一个Lval参数来选择实验室颜色的L值。

根据几次运行,这种方法的性能似乎比我原来的hcl版本要好得多(虽然这可能不仅是因为使用了Lab而不是hcl空间,而且还因为我只使用了hcl空间的一个维度,而使用了Lab的两个维度)。

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

​

​

为了简单起见,上面的示例将a和b值限制为与原点(ab-space中)的常量距离,并对所有三种颜色使用相同的L值。您可以将此方法扩展为使用实验室空间的所有三个维度。此外,不需要与原点保持一定的距离,您可以随意选择第一种颜色,然后要求选择下两种颜色,以便在实验室空间中最大限度地将所有三种颜色分离开来。

原始答案

您可以生成在色调维度中间隔相等的颜色(也就是说,彼此之间有最大可能的色调间隔)。例如:

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

​

​

这是另外九张随机抽签。正如你所看到的,有些组合效果不太好。但是也许你可以用不同的方法来分割颜色空间,看看你是否能得到更好的东西。

​

​

票数 4
EN

Stack Overflow用户

发布于 2017-04-14 23:26:17

一种非常简单的方法是在八种“标准”颜色中取样。

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

​

​

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

https://stackoverflow.com/questions/43420322

复制
相关文章

相似问题

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