2011-11-08 14 views
41

He tenido esto algunas veces, así que aquí va: estoy haciendo algunos trazados que contienen curvas con estimaciones de un parámetro dado un parámetro de ajuste.equivalente transparente del color dado

Normalmente, también tengo SD para cada valor estimado, por lo que podría mostrar barras de error alrededor de cada uno de ellos.

Sin embargo, no me gustan las barras de error, y preferiría una versión suavizada de la misma. Esto no es un problema en sí mismo (es decir, sé cómo hacer esto). Sin embargo, mi trama contiene varias de estas curvas similares, cada una en su propio color. Así que me gustaría agregar la 'región de error suavizada' a cada curva en un color que coincida con el color de la curva en sí. Por supuesto, me gustaría hacer esto de forma transparente, por lo que todavía puedo ver las otras curvas a través de la "región de error".

Entonces, mi pregunta es: dado un color (especificado por un número, un nombre o un valor rgb --- tenga en cuenta que los dos primeros plantean un problema adicional, pero esto ocurre con bastante frecuencia, ya que las funciones básicas de trazado tomar estos como valores de color válidos), ¿cómo puedo encontrar el color coincidente que tiene el mismo rgb pero un nivel alfa diferente (dado) (transparencia). Me gustaría una función como:

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

Esto debería funcionar para cosas como:

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

Editar odio cuando me olvido de algo obvio, pero @themel me señaló a él (gracias de nuevo) Aquí es una solución completa (nota: los trabajos vectorizados, por lo que puede pasar más de un color, y sólo una alfa se admite en este momento sin embargo):

#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()' maybe? – baptiste

+2

También hay 'alfa' en' escalas', quizás estén relacionados. El uno es escalas tiene una interfaz muy agradable. Es bastante flexible en su entrada.Creo que cualquier expresión de la forma 'plot (data, col = colors)' puede ser reemplazada por 'plot (data, col = alpha (colors, 0.5))' para obtener un 50% de transparencia. Esto funciona incluso si 'colors' es simplemente un vector de enteros que selecciona un color de la paleta estándar. –

+0

algo relacionado (según Google de todos modos) y que encontré muy útil: https://gist.github.com/mages/5339689/raw/576263b8f0550125b61f4ddba127f5aa00fa2014/add.alpha.R – PatrickT

Respuesta

36

¿Ha tenido un vistazo a ?rgb?

Uso:

RGB (rojo, verde, azul, alfa, nombres = NULL, maxColorValue = 1)

Un valor de transparencia alfa también se puede especificar (como una opacidad, así ' 0 'significa completamente transparente y' max 'significa opaco). Si alpha 'no está especificado, se genera un color opaco.

El parámetro alpha es para especificar la transparencia. col2rgb divide los colores R especificados de otras formas en RGB para que pueda alimentarlos al rgb.

+0

'col2rgb' era lo que me faltaba - debe haber leído sobre él :-(También no esperaba que esto funcionara en colores ya en formato rgb. Editaré mi propia pregunta para incluir una respuesta completa basada en la tuya. –

+0

No sabía nada de 'col2rgb' ¡Eso es realmente útil! –

+1

En mi caso, también fue necesario transponer el valor de retorno col2rgb() y pasar el argumento maxColorValue para la normalización: rgb (t (col2rgb (c ("rojo", "verde"))), alfa = 100 , maxColorValue = 255) –

3

Creo que es más común especificar alpha en [0,1]. Esta función hace que, además de aceptar varios colores como argumentos:

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) 

} 

Y, a prueba:

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

Hay una función adjustcolor en grDevices paquete, que funciona como este en su caso:

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

Muy simple y fácil de usar: agradable para mí, gracias. – jcfaria

Cuestiones relacionadas