Лучшая практика для сортировки различных шестнадцатеричных цветов в R - PullRequest
0 голосов
/ 26 июня 2018

Обновление: На основании ответов я исследую пакеты ColorBrewer и Colorspace R. По просьбе я переписываю свой оригинальный вопрос.

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

Например, Спектральные цвета Синтии Брюер (красные, синие, зеленые и т. Д. Вместе в одном потоке) иллюстрируют это.

Я прошу Логику, а не Код.

enter image description here


Пока что я попытался отсортировать по Hue, Hue + Value, Hue * Value, основываясь на этой статье, https://www.alanzucconi.com/2015/09/30/colour-sorting/

Этот вопрос граничит между R и теорией цвета.

Код в конце этого поста сортирует цвета по Hue, Hue + Value, Hue * Value (зависит от того, что вы комментируете или раскомментируете).

Пожалуйста, скажите мне (или дайте подсказку) о том, как получить результаты, аналогичные спектральным цветам Синтии Брюер

Unordered Colors:

enter image description here

Заказано на основании Hue:

enter image description here

Заказ на основе Hue + Value:

enter image description here

Заказано на основе Hue * Value:

enter image description here

Для справки, вот оригинальная, неупорядоченная палитра

> oldPal
 [1] "#22325f" "#88ce64" "#fbd234" "#b8091f" "#682f4e" "#fdea6e" "#4aec6a" "#fb7894" "#f13111" "#2584a0"
[11] "#6fa42c" "#db3717" "#051a8d" "#ef38a7" "#202c3d"

Преобразовано в HSV, затем транспонировано

> tHSVcol
               h         s         v
 [1,] 0.62295082 0.6421053 0.3725490
 [2,] 0.27672956 0.5145631 0.8078431
 [3,] 0.13232831 0.7928287 0.9843137
 [4,] 0.97904762 0.9510870 0.7215686
 [5,] 0.90935673 0.5480769 0.4078431
 [6,] 0.14452214 0.5652174 0.9921569
 [7,] 0.36625514 0.6864407 0.9254902
 [8,] 0.96437659 0.5219124 0.9843137
 [9,] 0.02380952 0.9294606 0.9450980
[10,] 0.53794038 0.7687500 0.6274510
[11,] 0.24027778 0.7317073 0.6431373
[12,] 0.02721088 0.8949772 0.8588235
[13,] 0.64093137 0.9645390 0.5529412
[14,] 0.89890710 0.7656904 0.9372549
[15,] 0.59770115 0.4754098 0.2392157

R код

library(RanglaPunjab)

RenderPal <- function(x,name){

  if ((missing(x)) || (missing(name))){
    stop("Internal error, please troubleshoot")
  }
  n <- length(x)
  old <- graphics::par(mar = c(0.5, 0.5, 0.5, 0.5))
  on.exit(graphics::par(old))

  graphics::image(1:n, 1, as.matrix(1:n), col = x,
                  ylab = "", xaxt = "n", yaxt = "n", bty = "n")
  graphics::rect(0, 0.9, n + 1, 1.1, col = grDevices::rgb(1, 1, 1, 0.8), border = NA)
  graphics::text((n + 1) / 2, 1, labels = name, cex = 2, family = "serif")
}

i <- NULL
oldPal <- NULL
rankorder <- NULL
orderedPal<- NULL
RGBcol <- NULL
HSVcol <- NULL
tHSVcol <- NULL
orderType <- NULL

# Paint the colors
PaintPalette("Teej","Gidha","Jutti3")

# Store the hex values
oldPal <- MergePalette("Teej","Gidha","Jutti3")

# Print hex values
oldPal

# Convert Hex to RGB
RGBcol <- col2rgb(oldPal)

# Print RGB values
RGBcol

# Convert RGB to HSV
HSVcol <- rgb2hsv(RGBcol)

# Print matrix
HSVcol

# Transpose matrix
tHSVcol <- t(HSVcol)

# Print matrix
tHSVcol


# Uncomment following to order by Hue, then Saturation, then Value
rankorder <- order(tHSVcol[,1],tHSVcol[,2],tHSVcol[,3])
orderType <- "Hue Ordering"

# Uncomment following to order by hANDv = Hue + Value
# hANDv <- apply(tHSVcol[,c(1,3)],1,sum)
# rankorder <- order(hANDv)
# orderType <- "Hue + Value Ordering"

# Uncomment following to order by hPRODv = Hue * Value
# hPRODv <- apply(tHSVcol[,c(1,3)],1,prod)
# rankorder <- order(hPRODv)
# orderType <- "Hue * Value Ordering"

rankorder

for (i in 1:length(rankorder)){
  orderedPal[i] <- oldPal[rankorder[i]]
}

# Print old, unordered palette
oldPal

# Print new, ordered palette
orderedPal

RenderPal(oldPal, "Unordered Palette")
RenderPal(orderedPal, orderType)

1 Ответ

0 голосов
/ 26 июня 2018

Как правило, вам придется либо упорядочить одну или несколько комбинаций RGBA, создать свои собственные объекты и установить метод order, либо использовать уже существующий пакет.

Cynthia Brewer имеет превосходную упаковку, RColorBrewer , в которой используются различные цветовые палитры, упорядоченные, расходящиеся или неупорядоченные. Некоторые из них оптимизированы для общих условий дальтонизма.

library(RColorBrewer)
display.brewer.all()# to see all of them

enter image description here

brewer.pal.info - это фрейм данных с информацией о каждой палитре

head(brewer.pal.info)
#          maxcolors category colorblind
# BrBG        11      div       TRUE
# PiYG        11      div       TRUE
# PRGn        11      div       TRUE
# PuOr        11      div       TRUE
# RdBu        11      div       TRUE
# RdGy        11      div      FALSE
...