我看过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)
不可
POLYGON:“#FF00FFFF”,CIRCLE:“#916DFFFF”,文字:“#24DAFFFF”
BAD
POLYGON:“#00FFFFFF”,CIRCLE:“#51E3E3FF”,文字:“#A2C7C7FF”
答案 0 :(得分:4)
我使用hcl
色彩空间的原始答案通常会生成难以区分的颜色组合。此更新的答案使用Lab颜色空间,该颜色空间根据颜色之间的感知距离进行缩放,因此Lab空间中的相似距离应对应于相似的感知颜色差异。在Lab中, L 是亮度或亮度,范围为0到100. a 表示绿色到红色, b 表示蓝色到黄色,两者都在-100到100的范围内。
以下代码为a
和b
生成两个随机值。如果我们将这两个值视为代表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())
为简单起见,上面的示例将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)
这里有九个随机抽奖。如您所见,有些组合效果不佳。但也许你可以用不同的方式来分割色彩空间,看看你能不能做得更好。
答案 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)