59

我已经有过几次了,所以这里是:我正在制作一些曲线图,其中包含给定调整参数的参数估计值。

通常,我也有每个估计值的 SD,所以我可以在每个估计值周围显示误差线。

但是,我不喜欢误差线,并且更喜欢它的一些平滑版本。这本身没有问题(即我知道该怎么做)。但是,我的绘图包含几条类似的曲线,每条曲线都有自己的颜色。因此,我想以与曲线本身颜色相匹配的颜色将“平滑误差区域”添加到每条曲线。当然,我想稍微透明地做到这一点,所以我仍然可以通过“错误区域”看到其他曲线。

所以,我的问题是:给定一种颜色(由数字、名称或 rgb 值指定——注意前两个会造成额外的问题,但这种情况经常发生,因为基本绘图函数将这些视为有效颜色值),如何找到具有相同 rgb 但不同(给定)alpha 级别(透明度)的匹配颜色。我想要一个类似的功能:

makeTransparent<-function(someColor, alpha=100)
{
  newColor<-someColor + alpha #I wish
  return(newColor)
}

这应该适用于以下情况:

makeTransparent(2)
makeTransparent("red")
makeTransparent(rgb(0,0,1))

编辑当我错过一些明显的东西时,我讨厌它,但是@themel 向我指出了它(再次感谢)。这是一个完整的解决方案(注意:工作矢量化,所以你可以传递不止一种颜色;虽然此时只支持一个 alpha):

#note: always pass alpha on the 0-255 scale
makeTransparent<-function(someColor, alpha=100)
{
  newColor<-col2rgb(someColor)
  apply(newColor, 2, function(curcoldata){rgb(red=curcoldata[1], green=curcoldata[2],
    blue=curcoldata[3],alpha=alpha, maxColorValue=255)})
}
4

5 回答 5

82

包中有一个函数adjustcolor,在grDevices您的情况下可以这样工作:

    adjustcolor( "red", alpha.f = 0.2)
于 2015-06-19T14:10:09.393 回答
52

你看过?rgb吗?

用法:

rgb(红色、绿色、蓝色、alpha、名称 = NULL、maxColorValue = 1)

还可以指定 alpha 透明度值(作为不透明度,因此“0”表示完全透明,“max”表示不透明)。如果未指定 alpha',则生成不透明的颜色。

alpha参数用于指定透明度。 col2rgb将以其他方式指定的 R 颜色拆分为 RGB,以便您可以将它们提供给rgb.

于 2011-11-08T08:39:55.907 回答
7

我认为更常见的是alpha[0,1]. 这个函数可以做到这一点,并接受几种颜色作为参数:

makeTransparent = function(..., alpha=0.5) {

  if(alpha<0 | alpha>1) stop("alpha must be between 0 and 1")

  alpha = floor(255*alpha)  
  newColor = col2rgb(col=unlist(list(...)), alpha=FALSE)

  .makeTransparent = function(col, alpha) {
    rgb(red=col[1], green=col[2], blue=col[3], alpha=alpha, maxColorValue=255)
  }

  newColor = apply(newColor, 2, .makeTransparent, alpha=alpha)

  return(newColor)

}

并且,要测试:

makeTransparent(2, 4)
[1] "#FF00007F" "#0000FF7F"
makeTransparent("red", "blue")
[1] "#FF00007F" "#0000FF7F"
makeTransparent(rgb(1,0,0), rgb(0,0,1))
[1] "#FF00007F" "#0000FF7F"

makeTransparent("red", "blue", alpha=0.8)
[1] "#FF0000CC" "#0000FFCC"
于 2013-12-27T06:37:58.183 回答
5

有价值的评论转换为答案:

alpha从包scales中使用- 第一个参数是颜色,第二个 alpha(在 0-1 范围内)。

或者写函数公开它:

makeTransparent <- function(someColor, alpha=100) scales::alpha(someColor, alpha/100)
于 2018-06-26T11:44:19.157 回答
5

像这样轻松转换十六进制颜色代码

adjustcolor("#F8766D", alpha.f = 0.2)
[1] "#F8766D33"

要确认它有效:

library(scales)
show_col(c("#F8766D", "#F8766D33"))

在此处输入图像描述

于 2020-04-13T17:21:37.043 回答