Создайте цветовую шкалу радуги на основе вектора, в порядке того вектора - PullRequest
6 голосов
/ 14 сентября 2011

Я ищу более элегантный способ сделать это:

#Create Dataset
set.seed(1)
x <- runif(100)
y <- runif(100)
z <- y*x

#Assign colors, based on z vector    
Data <- data.frame(Order=1:length(z),z=z)
Data <- Data[order(Data$z),]
Data$col <- rainbow(length(z))
orderedcolors <- Data[order(Data$Order),'col']

#Plot x vs y, colored by z
plot(x,y,col=orderedcolors)

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

Ответы [ 3 ]

12 голосов
/ 14 сентября 2011

Ваше решение назначает цвет для ранга ваших данных.Если это то, что вы имели в виду, то это здорово.

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

Сначала ваш код:

#Create Dataset
set.seed(1)
x <- runif(100)
y <- runif(100)
z <- y*x

par(mfrow=c(1,2))
#Assign colors, based on z vector    
Data <- data.frame(Order=1:length(z),z=z)
Data <- Data[order(Data$z),]
Data$col <- rainbow(length(z))
orderedcolors <- Data[order(Data$Order),'col']
plot(x,y,col=orderedcolors, main="Yours")

Далее мой код.Я использую функцию colorRamp, которая создает функцию, которая линейно интерполирует цвета с учетом входных данных для функции.Так как вход для colorRamp должен находиться в диапазоне [0;1], сначала я определяю небольшую вспомогательную функцию range01, которая масштабирует данные между 0 и 1. Наконец, поскольку colorRamp дает вывод в значениях RGB, я использую apply и rgb, чтобы вернуть эти значения в цвета, которыеplot понимает:

range01 <- function(x)(x-min(x))/diff(range(x))
rainbow(7)
cRamp <- function(x){
  cols <- colorRamp(rainbow(7))(range01(x))
  apply(cols, 1, function(xt)rgb(xt[1], xt[2], xt[3], maxColorValue=255))
}  

#Plot x vs y, colored by z
plot(x,y,col=cRamp(z), main="Mine")

Результаты.Обратите внимание на различное распределение цветов по осям.

enter image description here

10 голосов
/ 14 сентября 2011

Вы не сказали, как обращаться со связями, но сработает ли это:

plot(x,y,col = rainbow(length(z))[rank(z)])

Мне кажется, что это сгенерирует тот же результат, в основном помещая цвета в порядке z, используяиндексация и rank.

6 голосов
/ 14 сентября 2011

Вы можете просто создать радугу цветов и затем творчески индексировать ее

orderedcolors2 <- rainbow(length(z))[order(order(z))]

, который дает тот же набор цветов, что и ваш исходный код

> identical(orderedcolors2, orderedcolors)
[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...