我看过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)示例
好

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

多边形:"#00FFFFFF",圆圈:"#51E3E3FF",文字:#A2C7C7FF
发布于 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的两个维度)。
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值。您可以将此方法扩展为使用实验室空间的所有三个维度。此外,不需要与原点保持一定的距离,您可以随意选择第一种颜色,然后要求选择下两种颜色,以便在实验室空间中最大限度地将所有三种颜色分离开来。
原始答案
您可以生成在色调维度中间隔相等的颜色(也就是说,彼此之间有最大可能的色调间隔)。例如:
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)

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

发布于 2017-04-14 23:26:17
一种非常简单的方法是在八种“标准”颜色中取样。
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)

https://stackoverflow.com/questions/43420322
复制相似问题