как рассчитать градиент с несколькими измерениями цветов в R

это связано с этим вопросом но, возможно, более простой пример. Мне любопытно, есть ли разумный способ вычислить многомерный цветовой градиент с учетом трех или четырех произвольных цветов, как это делает функция r rgb() с красным, зеленым, синим? одномерный градиент прост (рис. 1), но тогда мне непонятно, как вычислить двумерный градиент (рис. 2) внутри треугольника. края легкие. важно то, что внутри

# one dimensional color gradient
one.dimensions <- colorRampPalette( c( "orange" , "blue" ) )( 100 )

plot( 1:100 , rep( 1 , 100 ) , col = one.dimensions , cex = 3 , pch = 16 , main  = 'one dimensional gradient' )

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

# here are the edges of a three-colored triangle
dimensions13 <- colorRampPalette( c( "orange" , "blue" ) )( 100 )
dimensions12 <- colorRampPalette( c( "orange" , "red" ) )( 100 )
dimensions23 <- colorRampPalette( c( "blue" , "red" ) )( 100 )

plot( 1:100 , c( 1:50 , 50:1 ) , type = 'n' , main = 'two dimensional gradient' )
points( 1:100 , rep( 1 , 100 ) , col = dimensions12 , cex = 3 , pch = 16 )
points( seq( 1 , 50 , length = 100 ) , seq( 1 , 50 , length = 100 ) , col = dimensions13 , cex = 3 , pch = 16 )
points( seq( 50 , 100 , length = 100 ) , seq( 50 , 1 , length = 100 ) , col = dimensions23 , cex = 3 , pch = 16 )

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


person Anthony Damico    schedule 26.10.2014    source источник
comment
Возможно, эти вопросы и ответы будут полезны ?   -  person Henrik    schedule 26.10.2014
comment
Небольшое примечание: когда вы пишете двухмерное и трехмерное, вы имеете в виду одномерное и двумерное (например, x-измерение против x- и y-измерения)?   -  person Henrik    schedule 26.10.2014
comment
@ Хенрик, да, хорошая мысль :)   -  person Anthony Damico    schedule 26.10.2014
comment
Без проблем! Возможно также изменить названия сюжетов ;)   -  person Henrik    schedule 26.10.2014
comment
@ Хенрик, эти вопросы и ответы очень актуальны, но я также хочу, чтобы эти белые крестики были в центре градиента, и похоже, что ни один из ответивших не указал, как это сделать? :/   -  person Anthony Damico    schedule 26.10.2014
comment
Снято в темноте, но, возможно, это поможет (обсудите ggplot2) stackoverflow.com/questions/21490210/ или research.stowers-institute.org/efg/Report/UsingColorInR.pdf   -  person Tyler Rinker    schedule 26.10.2014
comment
@TylerRinker спасибо, Тайлер, мне нравится ощущение геогородов в этом pdf;) я думаю, что хочу что-то близко к этому ответу, но должен быть более разумный способ его получения, чем метод грубой силы, который я показал:/   -  person Anthony Damico    schedule 26.10.2014
comment
этот вопрос может представлять интерес: значение цвета">ссылка   -  person Marc in the box    schedule 26.10.2014
comment
@Marcinthebox спасибо! но в ответе используется rgb, что является обманом;) мне нужно что-то, что принимает произвольный набор цветов (или я что-то неправильно понял?)   -  person Anthony Damico    schedule 26.10.2014
comment
@AnthonyDamico - нет, ваше право. Извините, я пропустил это... в связанном вопросе.   -  person Marc in the box    schedule 26.10.2014


Ответы (1)


вы можете рассмотреть три основные стратегии смешивания цветов:

1- субтрактивный, с использованием смешивания альфа-прозрачности R-графики. По сути, наложите несколько слоев с их собственным градиентом.

library(grid)

grid.newpage()
grid.raster(scales::alpha(colorRampPalette(c("white","blue"))(10), 0.3),
            width=1,height=1)
grid.raster(t(scales::alpha(colorRampPalette(c("white","red"))(10), 0.3)),
            width=1,height=1)

Одним из недостатков является то, что окончательный цвет зависит от порядка слоев.

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

цветовая модель CMYK может стать еще одним источником вдохновения.

2- добавка. Я придумал наивную реализацию следующим образом. Рассмотрим ваши N основных цветов (скажем, желтый, зеленый, оранжевый). Назначьте им длину волны видимого спектра (570нм, 520нм, 600нм). Каждому цвету присваивается вес в соответствии с положением в треугольнике (представьте себе N лазеров с настраиваемой интенсивностью). Теперь, чтобы получить цвет, связанный с этой смесью N лазерных источников, вам нужно свернуться с функции сопоставления цветов CIE. Это микширование физических звуков, сопоставление чисел с визуальным восприятием. Однако явно существует проблема уникальности: несколько комбинаций, скорее всего, дадут один и тот же цвет. В конце концов, у глаза есть только три разных типа рецепторов, поэтому N>3 никогда не приведет к биекции.

3- пиксельный (полутонирование). Разделите изображение на небольшие смежные области, как на ЖК-экранах, и каждый пиксель разделите на N субпикселей, каждый из которых имеет свой цвет. Издалека и/или при достаточном разрешении экрана/печати глаз не увидит деталей и размоет для вас соседние цвета.

person baptiste    schedule 27.10.2014
comment
Нравится мне это или нет, но это, наверное, правильный ответ :) спасибо!! - person Anthony Damico; 27.10.2014
comment
@baptiste у вас есть пример использования вариантов 2 или 3? - person scottyaz; 08.06.2015