我正在寻找一种更优雅的方式:
#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的最低值变化到最高值。
答案 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值给出输出,我使用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")
结果。注意轴附近颜色的不同分布。
答案 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