2011-09-14 137 views
6

我正在尋找一種更優雅的方式來做到這一點:創建基於矢量彩虹色標,該矢量的順序

#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的最低值到最高值變化。

回答

10

你還沒有說如何處理關係,但將這項工作:

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

這似乎產生了我同樣的輸出,通過基本上都採用索引和rank把顏色的z順序。

6

您只需創建的顏色可以得到相同的一組顏色你原來代碼中的彩虹,然後指數創造性地

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

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

你說'order(order())',我說'rank()'。番茄,湯姆啊。 – joran

+0

當我看到你的答案時,我意識到'rank()'在概念上更有意義;我只是沒有想到它! –

12

您的解決方案指定顏色的排名您的數據爲。如果這是你的想法,那很好。

但是,如果你真的在腦子裏,數據的應確定顏色,那麼這裏是一個解決方案:

首先,你的代碼:

#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值,我使用applyrgb得到這些值返回到該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