R 如何混合两个或多个调色板以显示组合的颜色值

R 如何混合两个或多个调色板以显示组合的颜色值,r,graphics,color-palette,R,Graphics,Color Palette,我试图创建一个绘图,其中颜色表示多个值的组合。在下面的示例中,我正在为与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(!m

我试图创建一个绘图,其中颜色表示多个值的组合。在下面的示例中,我正在为与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()
#所需函数“val2col”来自:http://www.menugget.blogspot.de/2011/09/converting-values-to-color-levels.html

val2col因为我更熟悉
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()
    

    dat+1谢谢Andre-这非常直观。代码也非常紧凑。在这样的绘图中添加相应的颜色比例是否容易?我想我认为减色青色-品红色-黄色类型的颜色模型(即,当没有应用颜色时等于白色)可能比加法RGB颜色模型更适合打印。@Marcinebox我的怀疑是,任何试图将两种元素混合到单一颜色比例中的尝试都很难解释。你想策划什么?你能用其他的美学来代替吗,例如尺寸或形状来表示第二个元素?我在考虑用这样一个图来表示地表水中的三种营养物浓度(即空间)。我希望这样一张地图可能是一种直观的方式来查看这些空间模式。我设想相应的颜色键是一个三点图,显示3种营养素浓度的颜色梯度。我建议你改用刻面。我发现这三个情节完全令人困惑和不直观。如果你在上面加上一个可能令人困惑的颜色组合,情况会变得更糟。三张并排的地图,每一张都显示了特定营养素的水平,应该更容易解释。