我正在寻找一种更优雅的方法来做到这一点:
#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 的最低值到最高值以彩虹尺度变化。
最佳答案
您的解决方案为数据的排名分配颜色。如果这就是您的想法,那就太好了。
但是,如果您确实认为数据的值应该决定颜色,那么这里有一个解决方案:
首先,你的代码:
#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 值输出,因此我使用 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")
结果。请注意轴附近颜色的不同分布。
关于r - 根据向量创建彩虹色标,按照该向量的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7420281/