2011-11-08 27 views
41

我已经有过几次了,所以在这里:我制作了一些曲线图,其中给出了调整参数的参数估计值。给定颜色的透明等效物

通常情况下,我也有每个估计值的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向我指出它(THX再次)。这里有一个完整的解决方案(注:作品矢量,所以你可以通过不止一种颜色,只有一个字母在这个时候支持虽然):

#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)}) 
} 
+1

'ggplot2 :: alpha()'也许? – baptiste

+2

'鳞片'也有'alpha',也许它们是相关的。其中之一是秤有一个非常漂亮的界面。它的输入非常灵活。我认为可以用plot(data,col = alpha(colors,0.5))代替'plot(data,col = colors)'形式的任何表达式以获得50%的透明度。即使“颜色”仅仅是一个从标准调色板中选择颜色的整数矢量,它也可以工作。 –

+0

有点相关(根据谷歌反正),我发现它非常有用:https://gist.github.com/mages/5339689/raw/576263b8f0550125b61f4ddba127f5aa00fa2014/add.alpha.R – PatrickT

回答

36

你有没有看看?rgb

用法:

RGB(红,绿,蓝,α,名字= NULL,maxColorValue = 1)

阿尔法透明度值也可以被指定(作为不透明度, 所以' 0“表示完全透明,”最大“表示不透明)。如果未指定 alpha',则会生成不透明的颜色。

alpha参数用于指定透明度。 col2rgb将以其他方式指定的R颜色分割为RGB,以便将它们馈送到rgb

+0

'col2rgb'是我错过的东西 - 必须仔细阅读:-(另外我不希望这个功能可以使用RGB格式的颜色,我将编辑我自己的问题以包含基于你的完整答案 –

+0

不知道关于'col2rgb' ,这是非常有用的! –

+1

在我的情况下,它也有必要转置col2rgb()返回值并传递maxColorValue参数进行标准化:rgb(t(col2rgb(c(“red”,“green”))),alpha = 100 ,maxColorValue = 255) –

3

我认为在[0,1]中指定alpha更常见。这个功能做到这一点,再加上接受几种颜色作为参数:

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" 
45

有一个在grDevices包的功能adjustcolor,你的情况是这样的:

adjustcolor("red", alpha.f = 0.2) 
+1

非常简单易用:对我很好,谢谢。 – jcfaria