r - 如何在R中对颜色进行排序
问题描述
我使用 colorfindr 生成了一个十六进制颜色代码的向量。
我想按颜色从浅到深对它们进行分类。
快速搜索发现这不是一个简单的问题,例如:https ://www.alanzucconi.com/2015/09/30/colour-sorting/或https://mathematica.stackexchange.com/questions/87588 /如何正确排序颜色
我正在使用的颜色矢量是:
my_colours <- c("#F6F5F5", "#F4F3F0", "#EDF2F0", "#E1E2E3", "#C2D3DD", "#F6F1E5",
"#404965", "#E4CCD0", "#DFC575", "#D14845", "#E8B426", "#DF7B6D",
"#8DBAD3", "#C44334", "#DE7E31", "#BCBFCD", "#9E4049", "#97372F",
"#BC9AB0", "#4E3427", "#132021", "#0273AD", "#1D3F59", "#F9E892",
"#E2A4AF", "#F6E8D3", "#A5B774", "#A38074", "#6B847E", "#61ABCC",
"#6F86AC", "#B2BC3D", "#718E43", "#077A85", "#28A8C4", "#1D7B51",
"#A57D35", "#3483B0", "#F7CA0E", "#F9CE73", "#FDE35C", "#FAE214",
"#F4DDD2", "#F4C8BE", "#F5BD87", "#F3B61E", "#F2A581", "#F38387",
"#F3A72F", "#F3952F")
看起来像这样:
我曾尝试在 {my_colours} 中对十六进制颜色代码进行简单排序,但这并没有真正改善顺序。
任何在 R 上下文中解决此查询的指针或指导都将受到欢迎。
解决方案
为了以令人愉悦的方式“排序”颜色,将相似的颜色组合在一起,我们可以尝试找到连接颜色空间中所有颜色的最短路径。这与著名的旅行商问题相同。这是在 R 中使用 RGB 颜色空间的一种快速方法:
# original colors
ggplot2::qplot(x = 1:50, y = 1, fill = I(my_colours), geom = 'col', width = 1) + ggplot2::theme_void()
library(TSP)
rgb <- col2rgb(my_colours)
tsp <- as.TSP(dist(t(rgb)))
sol <- solve_TSP(tsp, control = list(repetitions = 1e3))
ordered_cols <- my_colours[sol]
ggplot2::qplot(x = 1:50, y = 1, fill = I(ordered_cols), geom = 'col', width = 1) + ggplot2::theme_void()
您可以使用不同的色彩空间来获得不同的结果。
编辑:从浅到深排序要容易得多,只需使用实验室空间:
lab <- convertColor(t(rgb), 'sRGB', 'Lab')
ordered_cols2 <- my_colours[order(lab[, 'L'])]
ggplot2::qplot(x = 1:50, y = 1, fill = I(ordered_cols2), geom = 'col', width = 1) + ggplot2::theme_void()
推荐阅读
- php - 文件上传仅适用于 <10Kb 的文件
- database - 关系型 DBMS 真的很难扩展吗?
- sql-server - 如何从 UDF 返回 MEMORY OPTIMIZED 表?
- python - 如何使用 python 将 Mysql 加载到 Elasticsearch
- java - ActiveMQ 出列未消费消息
- php - 检查是否在 WooCommerce 中选中了提交的复选框
- sql - 不存在 - 应该返回一些东西,但不是
- javascript - 具有 ngmodel 默认值的 Angular 11 ng-select 不起作用
- amazon-web-services - 从 Google Cloud Postgres DB 同步到 Amazon Aurora RDS
- c++ - 错误 C2665 'OdlRead':28 个重载都不能转换所有参数类型