Как отсортировать цвета в R - PullRequest
1 голос
/ 13 апреля 2020

Я сгенерировал вектор шестнадцатеричных цветовых кодов, используя colorfindr.

Я бы хотел отсортировать их по цвету от светлого к темному.

Быстрый поиск показал, что это не простая проблема, например: https://www.alanzucconi.com/2015/09/30/colour-sorting/ или https://mathematica.stackexchange.com/questions/87588/how-to-sort-colors-properly

Цветовой вектор, с которым я работаю:


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")

, который выглядит следующим образом:

enter image description here

Я попытался безошибочно отсортировать шестнадцатеричные цветовые коды в {my_colours}, но это на самом деле не улучшает порядок.

Любые указатели или указания для решения этого запроса в контексте R будет приветствоваться.

1 Ответ

5 голосов
/ 13 апреля 2020

Чтобы "отсортировать" цвет приятным образом, когда сходные цвета сгруппированы, мы можем попытаться найти кратчайший путь, соединяющий все цвета в цветовом пространстве. Это оказывается тем же, что и проблема знаменитого коммивояжера. Вот быстрый способ сделать это в R с использованием цветового пространства RGB:

# original colors
ggplot2::qplot(x = 1:50, y = 1, fill = I(my_colours), geom = 'col', width = 1) + ggplot2::theme_void()

enter image description here

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()

enter image description here

Вы можете использовать разные цветовые пространства для получения разных результатов.


Редактировать: Сортировать от светлого к темному намного проще, просто используйте лабораторное пространство:

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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...