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

Zac*_*ach 6 graphics r 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)
Run Code Online (Sandbox Code Playgroud)

基本上,我想为z矢量中的每个点指定一种颜色,我希望这些颜色在彩虹范围内从z的最低值到它的最高值变化.

And*_*rie 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")
Run Code Online (Sandbox Code Playgroud)

接下来,我的代码.我使用colorRamp创建函数的函数,该函数在给定函数输入的颜色之间线性插值.由于输入colorRamp必须在[0; 1],我首先定义一个小帮助函数range01,在0和1之间缩放数据.最后,由于colorRamp以RGB值给出输出,我使用apply并将rgb这些值恢复为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")
Run Code Online (Sandbox Code Playgroud)

结果.注意轴附近颜色的不同分布.

在此输入图像描述


jor*_*ran 10

你还没有说过如何处理关系,但是这会起作用:

plot(x,y,col = rainbow(length(z))[rank(z)])
Run Code Online (Sandbox Code Playgroud)

这似乎为我生成相同的输出,基本上按照z使用索引和的顺序放置颜色rank.


Bri*_*ggs 6

您可以创建彩虹,然后创造性地索引它

orderedcolors2 <- rainbow(length(z))[order(order(z))]
Run Code Online (Sandbox Code Playgroud)

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

> identical(orderedcolors2, orderedcolors)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

  • 你说`order(order())`,我说`rank()`.番茄,汤姆啊来. (2认同)