Ваше решение назначает цвет для ранга ваших данных.Если это то, что вы имели в виду, то это здорово.
Однако, если вы действительно имели в виду, что значение данных должно определять цвет, то вот решение:
Сначала ваш код:
#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](https://i.stack.imgur.com/Or0gy.png)