2011-09-14 10 views
6

szukam bardziej elegancki sposób to zrobić:Tworzenie skalę kolorów tęczy opartej na wektorze, w kolejności od tego wektora

#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) 

Zasadniczo chcę przypisać kolor do każdego punktu w wektorze z i chcę, aby te kolory różniły się na skali tęczy od najniższych wartości z do najwyższych wartości.

Odpowiedz

10

Nie powiedział, jak radzić sobie z więzów, ale to będzie działać:

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

To wydaje się wygenerować taki sam efekt dla mnie, w zasadzie przez oddanie kolorów w kolejności z użyciu indeksowania i rank .

6

można po prostu stworzyć tęczę kolorów, a następnie indeksuje je twórczo

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

co daje ten sam zestaw kolorów jak oryginalnego kodu

> identical(orderedcolors2, orderedcolors) 
[1] TRUE 
+2

Mówisz 'zamówienie (zlecenie())', mówię 'Rank()'. Pomidor, tom-ah-to. – joran

+0

Kiedy zobaczyłem twoją odpowiedź, zdałem sobie sprawę, że 'rank()' ma sens w sensie koncepcyjnym; Po prostu o tym nie pomyślałem! –

12

Twoje rozwiązanie przypisuje kolor do rankingu Twoich danych. Jeśli o to ci chodziło, to świetnie.

Jednakże, jeśli naprawdę miał na myśli, że wartość danych należy określić kolor, to tutaj jest rozwiązanie:

pierwsze, Twój kod:

#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") 

Następny mój kod. Używam funkcji colorRamp, która tworzy funkcję, która interpoluje liniowo między kolorami, biorąc pod uwagę wejście do funkcji. Ponieważ wejście do colorRamp musi znajdować się w zakresie [0; 1], najpierw zdefiniować trochę funkcji pomocnika range01 który skaluje dane pomiędzy 0 a 1. Wreszcie, ponieważ colorRamp daje moc w wartościach RGB, używam apply i rgb uzyskać te wartości z powrotem do kolorów, które plot rozumie:

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") 

Wyniki. Zwróć uwagę na inny rozkład kolorów w pobliżu osi.

enter image description here

Powiązane problemy