Что такое "хорошая" палитра для расходящихся цветов в R? (или: можно ли вириди и магму объединить вместе?)

Меня интересует наличие "хорошей" расходящейся цветовой палитры. Очевидно, можно использовать только красный, белый и синий:

img <- function(obj, nam) {
  image(1:length(obj), 1, as.matrix(1:length(obj)), col=obj, 
        main = nam, ylab = "", xaxt = "n", yaxt = "n",  bty = "n")
}
rwb <- colorRampPalette(colors = c("red", "white", "blue"))
img(rwb(100), "red-white-blue")

введите описание изображения здесь

Поскольку я недавно влюбился в цветовые палитры viridis, я надеялся совместить виридис и магму, чтобы сформировать такие расходящиеся цвета (конечно, цветные слепые люди будут видеть только абсолютное значение цвета, но иногда это нормально).

Когда я пытался комбинировать viridis и magma, я обнаружил, что они не "заканчиваются" (или "начинают" ) в одном и том же месте, поэтому я получаю что-то вроде этого (я использую R, но это, вероятно, будет то же самое для пользователей python):

library(viridis)
img(c(rev(viridis(100, begin = 0)), magma(100, begin = 0)), "magma-viridis")

введите описание изображения здесь

Мы видим, что при близком к нулю виридие является фиолетовым, а магма черным. Я хотел бы, чтобы они оба начали (более или менее) одно и то же место, поэтому я попытался использовать 0.3 в качестве отправной точки:

img(c(rev(viridis(100, begin = 0.3)), magma(100, begin = 0.3)), "-viridis-magma(0.3)")

введите описание изображения здесь

Это действительно лучше, но мне интересно, есть ли лучшее решение.

(Я также "помещаю" пользователей python, так как viridis изначально из matplotlib, поэтому кто-то из них может знать о таком решении)

Спасибо!

Ответ 1

Я нахожу предложение Кеннета Морленда весьма полезным. Он реализован в пакете Rgnuplot (install.packages("Rgnuplot") достаточно, вам не нужно устанавливать график GNU). Чтобы использовать его, как обычные цветные карты, вам необходимо преобразовать его следующим образом:

cool_warm <- function(n) {
  colormap <- Rgnuplot:::GpdivergingColormap(seq(0,1,length.out=n),
                                             rgb1 = colorspace::sRGB( 0.230, 0.299, 0.754),
                                             rgb2 = colorspace::sRGB( 0.706, 0.016, 0.150),
                                             outColorspace = "sRGB")
  colormap[colormap>1] <- 1 # sometimes values are slightly larger than 1
  colormap <- grDevices::rgb(colormap[,1], colormap[,2], colormap[,3])
  colormap
}

img(red_blue_diverging_colormap(500), "Cool-warm, (Moreland 2009)")

cool-warm colormap Это так, как это выглядит в действии по сравнению с интерполированным RColorBrewer "RdBu": сравнение

Ответ 2

Уже были некоторые полезные и полезные предложения, но позвольте мне добавить несколько замечаний:

  • Палочки viridis и magma представляют собой последовательные палитры с множеством оттенков. Таким образом, по шкале вы увеличиваетесь от очень светлых цветов до довольно темных цветов. Одновременно яркость увеличивается, а оттенок изменяется от желтого до синего (либо через зеленый, либо через красный).
  • Разделяющие палитры могут быть созданы путем объединения двух последовательных палитр. Как правило, вы присоединяете их к светлым цветам, а затем позволяете им расходиться в разных темных тонах.
  • Обычно используются одноцветные последовательные палитры, которые расходятся от нейтрального светло-серого до двух разных темных цветов. Следует обратить внимание, однако, что разные "руки" палитры сбалансированы по отношению к яркости (светло-темному) и цветности (цветовая гамма).

Поэтому объединение магмы и виридиса не работает. Вы могли позволить им расходиться с подобным желтоватым цветом, но вы расходились бы к подобным синеватым цветам. Также с меняющимися оттенками стало бы сложнее судить о том, в какой руке у вас есть палитра.

Как упоминалось другими, ColorBrewer.org предоставляет хорошие расходящиеся палитры. Подход Мореланда также полезен. Еще одним общим решением является наша функция diverge_hcl() в пакете colorspace. Он описан в документе CSDA (http://dx.doi.org/10.1016/j.csda.2008.11.033), а дальнейшие рекомендации, направленные на метеорологию, но применимые за пределами, доступны в документе BAMS (http://dx.doi.org/10.1175/BAMS-D-13-00155.1).

Преимущество нашего решения в пространстве HCL (оттенок-яркость) заключается в том, что вы можете легко интерпретировать координаты. Это требует некоторой практики, но не так непрозрачно, как другие решения. Также мы предоставляем графический интерфейс hclwizard() (см. Ниже), который помогает понять важность разных координат.

Большинство палитр в вопросе и других ответах могут быть достаточно близки к diverge_hcl() при условии, что два оттенка (аргумент h), максимальная цветность (c) и минимальная/максимальная яркость (l) выбираются соответствующим образом. Кроме того, может потребоваться настроить аргумент power, который определяет, как быстро увеличиваются цветность и яркость. Как правило, цветность добавляется довольно быстро (power[1] < 1), тогда как яркость увеличивается медленнее (power[2] > 1).

Морельская "холодно-теплая" палитра, например, использует синий (h = 250) и красный (h = 10) оттенок, но с относительно небольшим контрастом яркости (l = 37 vs. l = 88):

coolwarm_hcl <- colorspace::diverge_hcl(11,
  h = c(250, 10), c = 100, l = c(37, 88), power = c(0.7, 1.7))

который выглядит довольно похоже (см. ниже) на:

coolwarm <- Rgnuplot:::GpdivergingColormap(seq(0, 1, length.out = 11),
  rgb1 = colorspace::sRGB( 0.230, 0.299, 0.754),
  rgb2 = colorspace::sRGB( 0.706, 0.016, 0.150),
  outColorspace = "sRGB")
coolwarm[coolwarm > 1] <- 1
coolwarm <- rgb(coolwarm[, 1], coolwarm[, 2], coolwarm[, 3])

В отличие от ColorBrewer.org BrBG палитра имеет гораздо более высокий контраст яркости (l = 20 vs. l = 95):

brbg <- rev(RColorBrewer::brewer.pal(11, "BrBG"))
brbg_hcl <- colorspace::diverge_hcl(11,
  h = c(180, 50), c = 80, l = c(20, 95), power = c(0.7, 1.3))

Полученные палитры сравниваются ниже с версией на основе HCL ниже оригинала. Вы видите, что они не идентичны, а довольно близки. С правой стороны я также сопоставлял viridis и плазму с палитрами на основе HCL.

палитры

Если вы предпочитаете прохладно-теплую или BrBG-палитру, это может зависеть от вашего личного вкуса, но также - что еще более важно - того, что вы хотите выявить в своей визуализации. Низкий контраст яркости в прохладно-теплой будет более полезен, если знак отклонения имеет большее значение. Высокий контраст яркости будет более полезен, если вы хотите определить размер (экстремальных) отклонений. Более практическое руководство содержится в документе BAMS, в то время как вычисления более подробно объясняются в документе CSDA.

Остальная часть кода репликации для рисунка выше:

viridis <- viridis::viridis(11)
viridis_hcl <- colorspace::heat_hcl(11,
  h = c(300, 75), c = c(35, 95), l = c(15, 90), power = c(0.8, 1.2))

plasma <- viridis::plasma(11)
plasma_hcl <- colorspace::heat_hcl(11,
  h = c(-100, 100), c = c(60, 100), l = c(15, 95), power = c(2, 0.9))

pal <- function(col, border = "transparent") {
  n <- length(col)
  plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1),
    axes = FALSE, xlab = "", ylab = "")
  rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border)
}

par(mar = rep(0, 4), mfrow = c(4, 2))
pal(coolwarm)
pal(viridis)
pal(coolwarm_hcl)
pal(viridis_hcl)
pal(brbg)
pal(plasma)
pal(brbg_hcl)
pal(plasma_hcl)

Вы можете исследовать наши предлагаемые цвета интерактивно в блестящем приложении: http://hclwizard.org:64230/hclwizard/. Для пользователей R вы также можете запустить блестящее приложение на своем компьютере (которое работает несколько быстрее, чем с нашего сервера), или вы можете запустить его версию Tcl/Tk (что еще быстрее):

colorspace::hclwizard(gui = "shiny")
colorspace::hclwizard(gui = "tcltk")

Если вы хотите понять, как выглядят пути палитр в координатах RGB и HCL, полезно использовать colorspace::specplot(). См. Например colorspace::specplot(coolwarm).

Ответ 3

Библиотека RColorBrewer предоставляет красивые палитры для = < 13 цветов. Например, палитра BrBG показывает расходящиеся цвета от коричневого до зеленого.

library(RColorBrewer)
display.brewer.pal(11, "BrBG")

введите описание изображения здесь

Который может быть расширен до менее информативной палитры, создавая палитры в и из среднего цвета.

brbg <- brewer.pal(11, "BrBG")
cols <- c(colorRampPalette(c(brbg[1], brbg[6]))(51), 
    colorRampPalette(c(brbg[6], brbg[11]))(51)[-1])

введите описание изображения здесь

Аналогично, используя ваш выбор палитр viridis и magma, вы можете попробовать найти сходство между ними. Это может быть точкой, где можно присоединить палитры к спине.

select.col <- function(cols1, cols2){
    x <- col2rgb(cols1)
    y <- col2rgb(cols2)
    sim <- which.min(colSums(abs(x[,ncol(x)] - y)))
    message(paste("Your palette will be", sim, "colors shorter."))
    cols.x <- apply(x, 2, function(temp) rgb(t(temp)/255))
    cols.y <- apply(y[,sim:ncol(y)], 2, function(temp) rgb(t(temp)/255))
    return(c(cols.x,cols.y))
}

img(select.col(rev(viridis(100,0)),magma(100,0)), "")
# Your palette will be 16 colors shorter.

Палитра

Ответ 4

Пакет scico ( scico for R, основанный на Scientific Color-Maps) имеет несколько хороших расходящихся палитр, которые однородны по восприятию и безопасны для слепых (например, vik, roma, berlin).

Также доступно для Python, MatLab, GMT, QGIS, Plotly, Paraview, VisIt, Mathematica, Surfer, d3 и т.д. Здесь

Бумага: Crameri, F. (2018), Геодинамическая диагностика, научная визуализация и StagLab 3.0, Geosci. Model Dev., 11, 2541-2562, doi: 10.5194/gmd-11-2541-2018

Изменить: scico теперь на CRAN. Запустите install.packages('scico') для установки

# install.packages("devtools")
# devtools::install_github("thomasp85/scico")
library(scico)
scico_palette_show(palettes = c("broc", "cork", "vik",
                                "lisbon", "tofino", "berlin",
                                "batlow", "roma"))

Другой замечательный пакет - cmocean (Python). Его цветовые карты доступны в R через pals пакет или Oce пакет.

Бумага: Thyng, KM, Greene, CA, Hetland, RD, Zimmerle, HM, & DiMarco, SF (2016). Истинные цвета океанографии. Океанография, 29 (3), 10, http://dx.doi.org/10.5670/oceanog.2016.66.
Обсуждение: PLOTCON 2016: Кристен Тинг, Пользовательские карты цветов для вашей области.

### install.packages("devtools")    
### devtools::install_github("kwstat/pals")   
library(pals)   
pal.bands(ocean.balance, ocean.delta, ocean.curl, main = "cmocean")   

Изменить: добавить палитры для дальтоников из пакета rcartocolor

library(rcartocolor)
display_carto_all(type = 'diverging', colorblind_friendly = TRUE)