R: уменьшение насыщенности цвета цветовой палитры

Я нахожусь в поиске функции, которая уменьшает насыщенность определенной цветовой палитры на определенную величину. Например. Представьте, что у меня есть палитра

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, и уменьшать насыщенность на определенную величину или позволять изменять яркость и контраст? (Я пытаюсь достичь радужной палитры с меньшим насыщением и более плавными переходами, чем стандартный)

EDIT: также открыла функцию muted в пакете scales, которая более или менее делает то, что я хочу: http://www.inside-r.org/packages/cran/scales/docs/muted

а также 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

Ответ 1

Здесь функция, которая будет обесцветить вектор входных цветов определенной пропорцией:

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

Ответ 2

Это работает нормально:

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

adjustcolor - это базовая функция R, которая позволяет вам регулировать цвета разными способами, но я нахожу кнопку alpha.f самой полезной.

Ответ 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