我正在寻找一种更优雅的方式来做到这一点:
#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.
您可以创建彩虹,然后创造性地索引它
orderedcolors2 <- rainbow(length(z))[order(order(z))]
Run Code Online (Sandbox Code Playgroud)
它提供与原始代码相同的颜色集
> identical(orderedcolors2, orderedcolors)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)