gpt4 book ai didi

r - 如何混合 2 个或多个调色板以显示组合颜色值

转载 作者:行者123 更新时间:2023-12-04 12:08:05 25 4
gpt4 key购买 nike

我正在尝试创建一个图,其中颜色代表多个值的组合。在下面的示例中,我将增加与 x 坐标相关联的红色值,并增加与 y 坐标相关联的蓝色值。

#required function 'val2col' from: http://www.menugget.blogspot.de/2011/09/converting-values-to-color-levels.html

val2col<-function(z, zlim, col = heat.colors(12), breaks){
if(!missing(breaks)){
if(length(breaks) != (length(col)+1)){stop("must have one more break than colour")}
}
if(missing(breaks) & !missing(zlim)){
zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions
zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3)
breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1))
}
if(missing(breaks) & missing(zlim)){
zlim <- range(z, na.rm=TRUE)
zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions
zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3)
breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1))
}
colorlevels <- col[((as.vector(z)-breaks[1])/(range(breaks)[2]-range(breaks)[1]))*(length(breaks)-1)+1] # assign colors to heights for each point
colorlevels
}


#data
x <- seq(100)
y <- seq(100)
grd <- expand.grid(x=x,y=y)

#assign colors to grd levels
pal1 <- colorRampPalette(c("white", rgb(1,0,0)), space = "rgb")
col1 <- val2col(x, col=pal1(10))
pal2 <- colorRampPalette(c("white", rgb(0,0,1)), space = "rgb")
col2 <- val2col(y, col=pal2(10))
col3 <- NA*seq(nrow(grd))
for(i in seq(nrow(grd))){
xpos <- grd$x[i]
ypos <- grd$y[i]
coltmp <- (col2rgb(col1[xpos])/2) + (col2rgb(col2[ypos])/2)
col3[i] <- rgb(coltmp[1], coltmp[2], coltmp[3], maxColorValue = 255)
}

#plot
png("2_color_scales.png", width=6, height=4, units="in", res=200)
layout(matrix(c(1,2,3), nrow=1, ncol=3), widths=c(4,1,1), heights=4, respect=T)
par(mar=c(4,4,2,2))
plot(grd,col=col3, pch=19)
par(mar=c(4,0,2,5))
image(x=1, y=x, z=t(as.matrix(x)), col=pal1(10), xaxt="n", yaxt="n", xlab="", ylab="")
box()
axis(4)
mtext("x", side=4, line=3, cex=0.7)
par(mar=c(4,0,2,5))
image(x=1, y=y, z=t(as.matrix(y)), col=pal2(10), xaxt="n", yaxt="n", xlab="", ylab="")
box()
axis(4)
mtext("y", side=4, line=3, cex=0.7)
dev.off()

enter image description here

结果在技术上是正确的,因为当 x = 1 和 y = 10 时,颜色“白色”和“蓝色”的混合分别返回较浅的蓝色阴影。但是,我更希望这个位置看起来像 y 颜色条中最深的蓝色一样“蓝色”。我想这将需要对较低的值使用透明度而不是白色。有没有人对如何实现这一点有建议?添加两种颜色,包括它们的透明度,超出了我的范围……我想可以在混合步骤中使用透明度值作为权重吗?

谢谢你的帮助。

最佳答案

因为我比较熟悉ggplot ,我将展示一个使用 ggplot 的解决方案.这有附带好处,因为 ggplot代码很简单,我们可以把讨论的重点放在色彩管理这个话题上,而不是R代码。

  • 从使用 expand.grid 开始创建数据框 dat包含红色和蓝色输入值的网格。
  • 使用函数rgb()创建颜色混合,并将其分配给 dat$mix
  • 阴谋。

  • 编码:
    dat <- expand.grid(blue=seq(0, 100, by=10), red=seq(0, 100, by=10))
    dat <- within(dat, mix <- rgb(green=0, red=red, blue=blue, maxColorValue=100))

    library(ggplot2)
    ggplot(dat, aes(x=red, y=blue)) +
    geom_tile(aes(fill=mix), color="white") +
    scale_fill_identity()

    enter image description here

    您会注意到色标与您建议的不同,但可能更直观。

    混合光时,没有任何颜色会产生黑色,而所有颜色都存在会产生白色。

    情节清楚地表明了这一点,我觉得解释起来相当直观。

    关于r - 如何混合 2 个或多个调色板以显示组合颜色值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11773295/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com