一个人怎么可以混合2个或多个调色板显示组合颜色值(How can one mix 2 or more

2019-06-26 16:54发布

我试图创造一个颜色代表不同值的组合的曲线图。 在下面的例子中,我施加增加的值用于与所述相关联的红色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()

其结果是在技术上正确当x = 1且y = 10,颜色的混合的“白色”和“蓝”分别返回的蓝色的颜色更浅。 但是,我宁愿喜欢这个位置看起来像“蓝色”为y彩条最黑暗的蓝色。 我想这将需要一个使用透明度较低的值,而不是白色。 有没有人对如何可能实现的建议? 添加两种颜色,包括它们的透明度,是超越我...我想一个可能能够使用的透明度值作为混合步骤的权重?

谢谢你的帮助。

Answer 1:

由于我比较熟悉ggplot ,我会用展示的解决方案ggplot 。 其优点是,由于侧面的好处ggplot代码很简单,我们可以集中讨论对色彩管理的主题,而不是R代码里面。

  1. 通过使用开始expand.grid创建一个数据帧dat含有的红色和蓝色的输入值的网格。
  2. 使用函数rgb()来创建混合色,并将其分配给dat$mix
  3. 情节。

代码:

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()


你会发现,色阶是从你的建议不同,但可能更直观。

当混合光,不存在任何颜色产量黑,和所有的颜色的存在产生白色。

这显然是由情节,我觉得这比较直观的解释说明。



文章来源: How can one mix 2 or more color palettes to show a combined color value