如何在R中生成许多最独特的颜色?


Answers:


108

我从RColorBrewer包中加入了所有定性调色板。定性调色板应分别提供X种最独特的颜色。当然,将它们混合在一起也可以得到同样颜色的调色板,但这是我所能获得的最好的颜色(74种颜色)。

library(RColorBrewer)
n <- 60
qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual',]
col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))
pie(rep(1,n), col=sample(col_vector, n))

colour_Brewer_qual_60

其他解决方案是:从图形设备中获取所有R颜色并从中进行采样。我删除了灰色阴影,因为它们太相似了。这给出了433种颜色

color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]

一套20种颜色

pie(rep(1,n), col=sample(color, n))

200种颜色n = 200

pie(rep(1,n), col=sample(color, n))

一套200种颜色


是否可以将十六进制代码转换col为相应的颜色名称?
Prradep

@Prradep是col什么意思?在color从图形设备有名称。如果在一般情况下,并不是所有的十六进制代码的意思是有相应的颜色名称(只有433色grDevices,但更多的十六进制代码)
JelenaČuklina

我在您的代码片段中提到了col=sample(col_vector, n)RColorBrewer包。例如,如何从中找到#B3E2CD, #E78AC3, #B3DE69可用的颜色名称 sample(col_vector,3)。另外,如何查找brewer.pal函数给定的所有十六进制代码及其颜色名称。
Prradep

2
@Prradep,因为RColorBrewer调色板不是从grDevices颜色派生而来的,它们具有映射的名称,而只是十六进制代码,据我所知,您不能使用RColorBrewer调色板,甚至是定性调色板来做到这一点。
JelenaČuklina

1
@ytu,则无法区分颜色。如果绝对必要,我建议在R中寻找“渐变创建”,然后使用颜色的随机采样。但是从颜色到要素的映射将不起作用,人类的感知可能处理20至40种颜色,其余的差别不大。
JelenaČuklina

70

以下是一些选择:

  1. 看一下palette功能:

     palette(rainbow(6))     # six color rainbow
     (palette(gray(seq(0,.9,len = 25)))) #grey scale
  2. colorRampPalette功能:

     ##Move from blue to red in four colours
     colorRampPalette(c("blue", "red"))( 4) 
  3. 查看colorBrewer软件包(和网站)。如果你想发散的颜色,然后选择分歧在网站上。例如,

     library(colorBrewer)
     brewer.pal(7, "BrBG")
  4. 我想色调的网站给出了很多漂亮的调色板。同样,只需选择所需的调色板。例如,您可以从网站获取rgb颜色并制作自己的调色板:

     palette(c(rgb(170,93,152, maxColorValue=255),
         rgb(103,143,57, maxColorValue=255),
         rgb(196,95,46, maxColorValue=255),
         rgb(79,134,165, maxColorValue=255),
         rgb(205,71,103, maxColorValue=255),
         rgb(203,77,202, maxColorValue=255),
         rgb(115,113,206, maxColorValue=255)))

感谢您的回答。它会产生颜色,但有些颜色之间并不是很独特。也许我应该在我的问题中更加强调这一点。
RNA

1
@RNAer我已经更新了答案。您可以使用建议3和4来获得不同的调色板。
csgillespie 2013年

1
I want hue是一个很棒的网站。这正是我想要的。给定一个数字,如何生成多种颜色的调色板。但是我们可以在R中自动执行吗?
RNA

太棒了。但是,该网站背后有很多机制。我认为重新实现并不是一件容易的事。如果i want hue有一个允许它自动查询的API,那将是很好的(也许是的-我没有花很长时间寻找)
Ben Bolker

8
@BenBolker -我做了主旨为的R版本i want hue在这里。可以提高效率(例如,通过将颜色样本保存为数据对象),但是总的想法就在那里。(加载devtools::source_gist('45b49da5e260a9fc1cd7')
jbaums 2014年

36

您也可以尝试以下randomcoloR软件包

library(randomcoloR)
n <- 20
palette <- distinctColorPalette(n)

您可以看到在饼图中可视化时选择了一组高度不同的颜色(如此处其他答案所建议):

pie(rep(1, n), col=palette)

在此处输入图片说明

以50种颜色的饼形图显示:

n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)

在此处输入图片说明


3
谢谢。我不得不使用unname(distinctColorPalette(n))ggplot来使其工作。我猜ggplot需要一个未命名的向量。 col_vector <- unname(distinctColorPalette(n))然后... + scale_color_manual(values=col_vector) ...
Gaurav

19

并非OP的问题的答案,但值得一提的是 viridis程序包具有用于顺序数据的良好调色板。它们在感知上是统一的,色盲安全且易于打印。

要获取调色板,只需安装软件包并使用函数viridis_pal()。有四个选项“ A”,“ B”,“ C”和“ D”可供选择

install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n)  # n = number of colors seeked

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

还有一个精彩的演讲,解释了YouTube上好的色彩图的复杂性:

Matplotlib更好的默认颜色图 SciPy 2015 | 纳撒尼尔·史密斯(Nathaniel Smith)和斯特凡·范德华特(Stéfanvan der Walt)


17
这不太适合独特的颜色。
克里斯托弗·约翰

13

您可以colorRampPalette从库或RColorBrewer包中使用:

使用colorRampPalette,您可以指定颜色,如下所示:

colorRampPalette(c("red", "green"))(5)
# [1] "#FF0000" "#BF3F00" "#7F7F00" "#3FBF00" "#00FF00"

您也可以选择提供十六进制代码:

colorRampPalette(c("#3794bf", "#FFFFFF", "#df8640"))(5)
# [1] "#3794BF" "#9BC9DF" "#FFFFFF" "#EFC29F" "#DF8640"
# Note that the mid color is the mid value...

有了RColorBrewer你可以使用颜色预先存在的调色板:

require(RColorBrewer)
brewer.pal(9, "Set1")
# [1] "#E41A1C" "#377EB8" "#4DAF4A" "#984EA3" "#FF7F00" "#FFFF33" "#A65628" "#F781BF"
# [9] "#999999"

查看RColorBrewer其他可用调色板的包装。希望这可以帮助。


1
谢谢。我喜欢最后的选择brewer.pal。但最多只能有9种颜色。我实际上有9个以上的类别。第一种替代方法生成的渐变颜色并不像我想要的那样独特。
RNA

2
您将无法选择许多“不同”的颜色。我想最多可以得到12个。您应该查看colorbrewer2.org并获取颜色(如果我正确的话,这里有1 12个调色板)。
阿伦(Arun)2013年

寻找12个以上的独特球头将很困难-我认为在colorbrewer页面上有关于此的讨论
alexwhan

没关系,只要它们是可用的“最”独特的颜色,即使数字增加它们也变得不那么独特。
RNA

3
如果您的问题在分配给相邻类别时是并排的相似颜色(就像彩虹调色板那样),那么您可以简单地将彩虹输出随机化,例如:rainbow(n = 10)[sample(10)]
大卫·罗伯茨(David Roberts)2015年

11

我建议对大型调色板使用外部来源。

http://tools.medialab.sciences-po.fr/iwanthue/

提供根据各种参数组成任意尺寸调色板的服务,并且

/graphicdesign/3682/where-can-i-find-a-large-palette-set-of-contrasting-colors-for-coloring-many-d/3815

从图形设计师的角度讨论了通用问题,并提供了许多可用调色板的示例。

要从RGB值组成调色板,您只需要复制矢量中的值即可,例如:

colors37 = c("#466791","#60bf37","#953ada","#4fbe6c","#ce49d3","#a7b43d","#5a51dc","#d49f36","#552095","#507f2d","#db37aa","#84b67c","#a06fda","#df462a","#5b83db","#c76c2d","#4f49a3","#82702d","#dd6bbb","#334c22","#d83979","#55baad","#dc4555","#62aad3","#8c3025","#417d61","#862977","#bba672","#403367","#da8a6d","#a79cd4","#71482c","#c689d0","#6b2940","#d593a7","#895c8b","#bd5975")

3

我找到了一个提供20种不同颜色的列表的网站:https : //sashat.me/2017/01/11/list-of-20-simple-distinct-colors/

col_vector<-c('#e6194b', '#3cb44b', '#ffe119', '#4363d8', '#f58231', '#911eb4', '#46f0f0', '#f032e6', '#bcf60c', '#fabebe', '#008080', '#e6beff', '#9a6324', '#fffac8', '#800000', '#aaffc3', '#808000', '#ffd8b1', '#000075', '#808080', '#ffffff', '#000000')

你可以试试看!


1
这实际上并不能回答有关生成n 独特颜色而不是一组定义的颜色的问题。尝试更新您的答案
Michal

1

您可以生成如下颜色:

myCol = c("pink1", "violet", "mediumpurple1", "slateblue1", "purple", "purple3",
          "turquoise2", "skyblue", "steelblue", "blue2", "navyblue",
          "orange", "tomato", "coral2", "palevioletred", "violetred", "red2",
          "springgreen2", "yellowgreen", "palegreen4",
          "wheat2", "tan", "tan2", "tan3", "brown",
          "grey70", "grey50", "grey30")

这些颜色尽可能不同。对于那些相似的颜色,它们会形成一个渐变,以便您可以轻松分辨出它们之间的差异。


0

在我的理解中,搜索独特的颜色与有效地从一个单位立方体进行搜索有关,其中立方体的3个维度是沿着红色,绿色和蓝色轴的三个向量。可以简化为在圆柱中搜索(类似于HSV),在其中固定饱和度(S)和值(V)并找到随机的色相值。它在许多情况下都有效,请在此处查看:

https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/

在R中

get_distinct_hues <- function(ncolor,s=0.5,v=0.95,seed=40) {
  golden_ratio_conjugate <- 0.618033988749895
  set.seed(seed)
  h <- runif(1)
  H <- vector("numeric",ncolor)
  for(i in seq_len(ncolor)) {
    h <- (h + golden_ratio_conjugate) %% 1
    H[i] <- h
  }
  hsv(H,s=s,v=v)
}

另一种方法是“统一”使用R包 https://cran.r-project.org/web/packages/uniformly/index.html

这个简单的函数可以生成独特的颜色:

get_random_distinct_colors <- function(ncolor,seed = 100) {
  require(uniformly)
  set.seed(seed)
  rgb_mat <- runif_in_cube(n=ncolor,d=3,O=rep(0.5,3),r=0.5)
  rgb(r=rgb_mat[,1],g=rgb_mat[,2],b=rgb_mat[,3])
}

可以通过网格搜索想到更多涉及的功能:

get_random_grid_colors <- function(ncolor,seed = 100) {
  require(uniformly)
  set.seed(seed)
  ngrid <- ceiling(ncolor^(1/3))
  x <- seq(0,1,length=ngrid+1)[1:ngrid]
  dx <- (x[2] - x[1])/2
  x <- x + dx
  origins <- expand.grid(x,x,x)
  nbox <- nrow(origins) 
  RGB <- vector("numeric",nbox)
  for(i in seq_len(nbox)) {
    rgb <- runif_in_cube(n=1,d=3,O=as.numeric(origins[i,]),r=dx)
    RGB[i] <- rgb(rgb[1,1],rgb[1,2],rgb[1,3])
  }
  index <- sample(seq(1,nbox),ncolor)
  RGB[index]
} 

通过以下方式检查此功能:

ncolor <- 20
barplot(rep(1,ncolor),col=get_distinct_hues(ncolor))          # approach 1
barplot(rep(1,ncolor),col=get_random_distinct_colors(ncolor)) # approach 2
barplot(rep(1,ncolor),col=get_random_grid_colors(ncolor))     # approach 3

但是,请注意,用人类可感知的颜色定义不同的调色板并不容易。以上哪种方法会产生不同的颜色,还有待测试。


0

您可以为此使用Polychrome软件包。它只需要颜色的数量和几种seedcolors。例如:

# install.packages("Polychrome")
library(Polychrome)

# create your own color palette based on `seedcolors`
P36 = createPalette(36,  c("#ff0000", "#00ff00", "#0000ff"))
swatch(P36)

您可以在https://www.jstatsoft.org/article/view/v090c01上了解有关此软件包的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.