La soluzione assegna il colore al rango dei tuoi dati. Se è quello che avevi in mente, allora è grandioso.
Tuttavia, se davvero aveva in mente che il valore di dei dati dovrebbe determinare il colore, allora ecco una soluzione:
In primo luogo, il tuo codice:
#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")
successivo, il mio codice. Io uso la funzione colorRamp
che crea una funzione che interpola linearmente tra i colori dati l'input della funzione. Poiché l'input su colorRamp
deve essere compreso nell'intervallo [0; 1], in primo luogo ho definisco un po funzione di supporto range01
scalabile di dati tra 0 e 1. Infine, dal momento che colorRamp
dà uscita in valori RGB, io uso apply
e rgb
per ottenere questi valori tornare in colori che plot
capisce:
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")
I risultati. Si noti la diversa distribuzione a colori vicino agli assi.

Tu dici 'ordine (ordine())', io dico 'rango()'. Pomodoro, tom-ah-to. – joran
Quando ho visto la tua risposta, mi sono reso conto che 'rank()' aveva più senso concettualmente; Non ci ho pensato! –