基于向量创建彩虹色比例尺,按照该向量的顺序排序。

7
我正在寻找一种更优雅的方法来完成这个过程:
#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 向量中的每个点分配一种颜色,并且我希望这些颜色在彩虹色中从最低值到最高值变化。

3个回答

11

你的解决方案为数据的排名分配颜色。如果这正是你想要的,那就很好。

但是,如果你真的想让数据的决定颜色,那么这里有一个解决方案:

首先,你的代码:

#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


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
当我看到你的回答时,我意识到rank()在概念上更有意义;我只是没有想到! - Brian Diggs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接