【问题标题】:R: reducing colour saturation of a colour paletteR:降低调色板的色彩饱和度
【发布时间】:2014-12-06 12:36:23
【问题描述】:

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

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

是否有任何功能可以处理这个col.palette 颜色矢量,并降低一定量的饱和度,或者允许改变亮度和对比度? (我正在尝试实现比标准调色板饱和度更低且过渡更平滑的彩虹调色板)

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

以及下面 Josh O'Brien 提到的 colorspace 包中的 rainbow_hcl,这是我正在寻找的那种更柔和、强度相同的彩虹: 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)

【问题讨论】:

    标签: r colors


    【解决方案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)
    

    【讨论】:

    • 非常感谢 - 这就是我想要的!似乎我也必须操纵 V 分量,以避免颜色看起来褪色......
    • @TomWenseleers -- 哦,很好。如果您想出一些聪明的东西,请考虑将其留在这里作为更好的答案。如果您还没有发现它,您可能会发现运行colortools::choose_palette(rainbow_hcl) 会很有趣,然后在生成的 GUI 中将绘图类型设置为“Pie”,并以这种方式探索您的一些选项。干杯。
    • 我真的不认为这应该是公认的正确解决方案。它将颜色去饱和到白色而不是灰色,我认为从大多数用户的角度来看,这不是预期的行为。
    【解决方案2】:

    这似乎工作正常:

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

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

    【讨论】:

    • 感谢您向我指出此功能!就我而言,我不想更改 alpha/透明度,因为它用于 3D rgl 绘图。虽然 adjustcolor 不错,但它似乎不允许对亮度、对比度和饱和度等内容进行轻松操作(除非这些将由自定义转换指定)。
    • 感谢@TomWenseleers 的提示 - 我也需要在 3D 绘图中进行颜色转换 (rglwidget)。
    【解决方案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)
    

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

    【讨论】:

    • 非常感谢!这仅适用于特定的彩虹调色板,而不适用于任何调色板?
    • @TomWenseleers 我做了一些搜索。你可能想看看?hsv。根据 R 文档,如果您使用 hsv() 并创建颜色,则函数返回的值可以与 col = 规范一起使用。因此,您可以在绘制图形之前控制饱和度。
    • 哈好吧,我明白了 - 所以基本上转换为 HSV,然后更改饱和度值,对吧?我刚刚尝试使用cols=colorRampPalette(rainbow(13),interpolate ="spline")(1000); cols=apply(sapply(cols,col2rgb),2,rgb2hsv); cols[2,]=cols[2,]/2;cols=apply(cols,2,hsv);pie(rep(1,1000), col=cols,lty=0,labels=NA),但这似乎不起作用 - 任何想法我做错了什么?
    • @TomWenseleers 我还没有处理过这个级别的颜色问题。但是,这就是我的猜测。将 rgb 转换为 hsv 后,您将拥有三行。我猜第二行可能是 s。如果您更改行中的值,您将控制饱和度;不需要HSV。对于饼图,col 采用颜色向量。你的 cols 仍然在矩阵中。我想你可能必须从 hsv、rgb 到颜色。我看到post 说 R 中没有 hsv2rgb 函数。这是我目前能做的最好的。
    • @TomWenseleers 还有一个。我检查了其他调色板,例如 heat.colors、cm.colors 和 topo.colors。在这些函数中,我看到了hsv。如果你需要使用这些功能,你可以修改它们。
    猜你喜欢
    • 2012-11-28
    • 2016-01-28
    • 2018-08-16
    • 2014-07-05
    • 2011-05-17
    • 2012-03-15
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多