如何在R中生成一些最独特的颜色?

RNA*_*RNA 119 r colors palette color-palette colorbrewer

我正在绘制一个分类数据集,并希望使用独特的颜色来表示不同的类别.给定一个数字n,我怎样才能获得nR中MOST独特颜色的数量?谢谢.

Jel*_*ina 95

我从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))
Run Code Online (Sandbox Code Playgroud)

colour_Brewer_qual_60

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

color = grDevices::colors()[grep('gr(a|e)y', grDevices::colors(), invert = T)]
Run Code Online (Sandbox Code Playgroud)

一套20种颜色

pie(rep(1,n), col=sample(color, n))
Run Code Online (Sandbox Code Playgroud)

200种颜色n = 200:

pie(rep(1,n), col=sample(color, n))
Run Code Online (Sandbox Code Playgroud)

一套200种颜色

  • @Prradep,因为`RColorBrewer`调色板不是来自`grDevices`颜色,它们有名称映射,但只是十六进制代码,据我所知,你不能用`RColorBrewer`调色板,甚至是定性调色板. (2认同)

csg*_*pie 61

以下是一些选项:

  1. 看看这个palette功能:

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

    ##Move from blue to red in four colours
    colorRampPalette(c("blue", "red"))( 4) 
    
    Run Code Online (Sandbox Code Playgroud)
  3. 查看colorBrewer包(和网站).如果您想要发散颜色,请在网站上选择发散.例如,

    library(colorBrewer)
    brewer.pal(7, "BrBG")
    
    Run Code Online (Sandbox Code Playgroud)
  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)))
    
    Run Code Online (Sandbox Code Playgroud)

  • @BenBolker - 我已经为"我想要hue",[这里](https://gist.github.com/johnbaums/45b49da5e260a9fc1cd7)的R版本做了一个要点.可以提高效率(例如,通过将颜色样本保存为数据对象),但总的想法是存在的.(用`devtools :: source_gist('45b49da5e260a9fc1cd7')加载`) (8认同)

Meg*_*ron 29

你也可以试试这个randomcoloR:

library(randomcoloR)
n <- 20
palette <- distinctColorPalette(n)
Run Code Online (Sandbox Code Playgroud)

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

pie(rep(1, n), col=palette)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

显示在50种颜色的饼图中:

n <- 50
palette <- distinctColorPalette(n)
pie(rep(1, n), col=palette)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 谢谢.我不得不使用`unname(distinctColorPalette(n))`来使用ggplot.我猜ggplot需要一个未命名的向量.`col_vector < - unname(distinctColorPalette(n))`然后`... + scale_color_manual(values = col_vector)...` (3认同)

Gor*_*ker 16

还有一种相当"新"的方式来获得最佳的独特调色板,同样关于色盲和使用Viridis调色板可能的黑白转换.

要获得调色板,只需安装包并使用该功能 viridis

install.packages("viridis")
library(viridis)
viridis_pal(option = "D")(n)  # n = number of colors seeked
Run Code Online (Sandbox Code Playgroud)

使用选项"A","B","C"和"D"可在这些调色板之间进行选择:

在此输入图像描述

有关更多示例,请访问包的插图.其中一些漂亮的例子:

在此输入图像描述

在此输入图像描述

还有很好的演讲解释了YouTube上优秀调色板的复杂性:

Matplotlib的更好的默认Colormap | SciPy 2015 | Nathaniel Smith和Stéfanvander Walt

  • 这不太适合独特的颜色. (12认同)

Aru*_*run 13

您可以使用colorRampPalettebase或RColorBrewerpackage:

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

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

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

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

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

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

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

  • 你将无法选择许多"不同"的颜色.我想你最多可以获得12个.您应该查看http://colorbrewer2.org/并获取颜色(如果我是正确的话,那里有12个调色板). (2认同)
  • 如果您的问题在分配给相邻类别时并排显示相似的颜色(如彩虹调色板那样),那么您可以简单地将彩虹输出随机化为:rainbow(n = 10)[sample(10)] (2认同)

Rom*_*man 11

我建议使用外部源来制作大型调色板.

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

有一个服务,根据各种参数和组成任何大小的调色板

https://graphicdesign.stackexchange.com/questions/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")
Run Code Online (Sandbox Code Playgroud)


Jot*_* eN 10

为此,您可以使用Polychrome包。它只需要颜色的数量和一些seedcolors。例如:

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

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

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


小智 5

我找到了一个提供 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')
Run Code Online (Sandbox Code Playgroud)

你可以试试!

  • 这并没有真正回答这个问题,即生成“n”个独特的颜色,而不是一组定义的颜色。尝试更新您的答案 (2认同)