Как сопоставить векторные значения с цветами из цветовой шкалы в R? - PullRequest
6 голосов
/ 12 июня 2011

Это, вероятно, тривиальная вещь в R, но я не могу найти встроенную функцию, которая делает это:

Как преобразовать вектор значений (скажем, числовые значения) в вектор цветов с учетом цветовой шкалы.

1 Ответ

7 голосов
/ 12 июня 2011

Идея в моем комментарии выше может быть реализована через seq() и cut().Первым шагом является создание одинаковых интервальных интервалов в диапазоне данных

brks <- with(mtcars, seq(min(mpg), max(mpg), length.out = 65))

. Теперь мы назначим каждое из наблюдений одному из интервалов, образованных перерывами brks

grps <- with(mtcars, cut(mpg, breaks = brks, include.lowest = TRUE))

grps - это коэффициент, указывающий, какой ячейке назначается каждое наблюдение в данных

> head(grps)
[1] (20.7,21]   (20.7,21]   (22.5,22.9] (21,21.4]   (18.5,18.8]
[6] (17.7,18.1]
64 Levels: [10.4,10.8] (10.8,11.1] (11.1,11.5] ... (33.5,33.9]

Поскольку grps хранится внутри как целое число 1:nlevels(grps)), мы можем использовать это целое число для индексации цветаramp:

> terrain.colors(64)[grps]
 [1] "#CADF00FF" "#CADF00FF" "#E6D90EFF" "#D3E100FF" "#96D300FF"
 [6] "#85CF00FF" "#3CBA00FF" "#E8C133FF" "#E6D90EFF" "#9ED500FF"
[11] "#85CF00FF" "#67C700FF" "#76CB00FF" "#51C000FF" "#00A600FF"
[16] "#00A600FF" "#43BC00FF" "#F1D6D3FF" "#EFBEACFF" "#F2F2F2FF"
[21] "#DCE300FF" "#51C000FF" "#51C000FF" "#29B400FF" "#9ED500FF"
[26] "#EBB16EFF" "#EAB550FF" "#EFBEACFF" "#58C300FF" "#AFD900FF"
[31] "#4ABE00FF" "#D3E100FF"

Альтернативой может быть использование colourRamp(), которое возвращает функцию, которая интерполирует набор предоставленных цветов.Производимая функция принимает значения в диапазоне [0,1), которые охватывают диапазон цветовой шкалы.Сначала мы создаем функцию линейного изменения цвета, которая интерполирует между красным и синим цветами:

FUN <- colorRamp(c("red","blue"))

Затем мы берем наши входные данные и получаем их с интервалом [0,1):

MPG <- with(mtcars, (mpg - min(mpg)) / diff(range(mpg)))

Затем мы используем FUN() для генерации цветов:

> cols <- FUN(MPG)
> head(cols)
         [,1]      [,2] [,3]
[1,] 139.9787 115.02128    0
[2,] 139.9787 115.02128    0
[3,] 120.4468 134.55319    0
[4,] 135.6383 119.36170    0
[5,] 164.9362  90.06383    0
[6,] 171.4468  83.55319    0

Объект, возвращаемый FUN(), представляет собой матрицу значений для красного, зеленого и синего каналов.Чтобы преобразовать их в шестнадцатеричные коды, которые R может использовать, мы используем функцию rgb():

> rgb(cols, maxColorValue=256)
 [1] "#8B7300" "#8B7300" "#788600" "#877700" "#A45A00" "#AB5300"
 [7] "#D42A00" "#679700" "#788600" "#9F5F00" "#AE5000" "#BD4100"
[13] "#B34B00" "#CA3400" "#FE0000" "#FE0000" "#D02E00" "#10EE00"
[19] "#26D800" "#00FE00" "#867800" "#C73700" "#CA3400" "#DF1F00"
[25] "#9F5F00" "#47B700" "#55A900" "#26D800" "#C43A00" "#996500"
[31] "#CC3200" "#877700"
...