R:降低调色板的颜色饱和度

时间:2014-10-11 12:30:16

标签: r colors

我正在寻找能够将给定调色板的饱和度降低一定量的功能。例如。想象我有调色板

library(colorRamps)    
col.palette=colorRampPalette(rainbow(13),interpolate ="spline")(1000)
pie(rep(1,1000), col=col.palette,lty=0,labels=NA)

enter image description here

是否有任何功能可用于此col.palette颜色矢量,并将饱和度降低一定量,或允许更改亮度和对比度? (我试图获得一个彩虹调色板,其饱和度更低,过渡更平滑,比标准的更好)

编辑:也刚刚发现包muted中的函数scales或多或少地做了我想要的: http://www.inside-r.org/packages/cran/scales/docs/muted

以及下面Josh O' Brien提到的rainbow_hcl包中的colorspace,这是我正在寻找的那种更柔和,同等强度的彩虹: http://www.inside-r.org/packages/cran/colorspace/docs/rainbow_hcl

library(colorspace)
pie(rep(1,1000), col=rainbow_hcl(1000,c=100,l=60),lty=0,labels=NA)

enter image description here

3 个答案:

答案 0 :(得分:16)

这是一个按指定比例对输入颜色矢量进行去饱和的函数:

library(colorspace)   ## hsv colorspace manipulations
library(RColorBrewer) ## For some example colors

## Function for desaturating colors by specified proportion
desat <- function(cols, sat=0.5) {
    X <- diag(c(1, sat, 1)) %*% rgb2hsv(col2rgb(cols))
    hsv(X[1,], X[2,], X[3,])
}

以下是行动中的例子:

## Utility function for plotting color palettes, 
## (from vignette("hcl-colors"))
pal <- function(col, border = "light gray", ...) {
  n <- length(col)
  plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1),
  axes = FALSE, xlab = "", ylab = "", ...)
  rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border)
}

## Some example colors
cc <- brewer.pal(9, 'Set1')
cc75 <- desat(cc, 0.75)
cc50 <- desat(cc, 0.50)
cc25 <- desat(cc, 0.25)

## Plot 'em
par(mfcol = c(4,1), mar = c(0,0,0,0))
pal(cc)
pal(cc75)
pal(cc50)
pal(cc25)

enter image description here

答案 1 :(得分:9)

这似乎工作正常:

col2 <- adjustcolor(col.palette,alpha.f=0.5)
pie(rep(1,1000), col=col2,lty=0,labels=NA)

adjustcolor是一个基本的R函数,可以让你以多种方式调整颜色,但我发现alpha.f旋钮最有用。

答案 2 :(得分:3)

这是另一种方法。在rainbow()中,您可以使用另外两个参数(即s和v)。 s用于饱和。如果您使用这两个参数,您将能够得到您想要的。

col.palette=colorRampPalette(rainbow(13, s = 1, v = 0.8),interpolate = "spline")(1000)
pie(rep(1,1000), col=col.palette,lty=0,labels=NA)

enter image description here

col.palette=colorRampPalette(rainbow(13, s = 0.6, v = 1),interpolate = "spline")(1000)
pie(rep(1,1000), col=col.palette,lty=0,labels=NA)

enter image description here