根据矢量按照矢量的顺序创建彩虹色标

时间:2011-09-14 17:14:42

标签: r graphics colors

我正在寻找一种更优雅的方式:

#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 个答案:

答案 0 :(得分: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

答案 1 :(得分:10)

你还没有说过如何处理关系,但这会有效:

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

这似乎为我生成了相同的输出,基本上使用索引和z将颜色按rank的顺序排列。

答案 2 :(得分:6)

您可以创建彩虹,然后创造性地将其编入索引

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

,它提供与原始代码相同的颜色集

> identical(orderedcolors2, orderedcolors)
[1] TRUE