web-dev-qa-db-fra.com

Équivalent transparent d'une couleur donnée

Je l'ai eu plusieurs fois, alors voici: je fais des graphiques qui contiennent des courbes avec des estimations d'un paramètre donné un paramètre de réglage.

En règle générale, j'ai également des SD pour chaque valeur estimée, donc je pouvais afficher des barres d'erreur autour de chacune d'entre elles.

Cependant, je n'aime pas les barres d'erreur, et je préfère une version lissée. Ce n'est pas un problème en soi (c'est-à-dire que je sais comment faire). Cependant, mon intrigue contient plusieurs de ces courbes similaires, chacune dans sa propre couleur. Je voudrais donc ajouter la "région d'erreur lissée" à chaque courbe dans une couleur qui correspond à la couleur de la courbe elle-même. Bien sûr, je voudrais le faire de manière quelque peu transparente, afin que je puisse toujours voir les autres courbes à travers la "région d'erreur".

Donc, ma question est la suivante: étant donné une couleur (spécifiée par un nombre, un nom ou une valeur RVB --- notez que les deux premiers posent un problème supplémentaire, mais cela se produit assez souvent, car les fonctions de traçage de base les prennent comme valides couleurs), comment trouver la couleur correspondante qui a le même RVB mais un niveau alpha différent (donné) (transparence). Je voudrais une fonction comme:

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

Cela devrait fonctionner pour des choses comme:

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

Edit Je déteste quand je manque quelque chose d'évident, mais @themel me l'a indiqué (encore merci). Voici une solution complète (note: fonctionne vectorisé, donc vous pouvez passer plus d'une couleur; un seul alpha est cependant pris en charge pour le moment):

#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)})
}
50
Nick Sabbe

Avez-vous jeté un œil à ?rgb?

Usage:

rgb (rouge, vert, bleu, alpha, noms = NULL, maxColorValue = 1)

Une valeur de transparence alpha peut également être spécifiée (comme une opacité, donc "0" signifie entièrement transparent et "max" signifie opaque). Si alpha ’n'est pas spécifié, une couleur opaque est générée.

Le paramètre alpha sert à spécifier la transparence. col2rgb divise les couleurs R spécifiées d'une autre manière en RVB afin que vous puissiez les alimenter dans rgb.

47
themel

Il y a une fonction adjustcolor dans le package grDevices, qui fonctionne comme ceci dans votre cas:

    adjustcolor( "red", alpha.f = 0.2)
63
Stepan S. Sushko

Je pense qu'il est plus courant de spécifier alpha dans [0,1]. Cette fonction le fait et accepte plusieurs couleurs comme arguments:

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)

}

Et, pour tester:

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

Conversion commentaire précieux pour répondre:

Utilisez alpha du package scales - le premier argument est la couleur, le deuxième alpha (dans la plage 0-1).

Ou écrivez la fonction:

makeTransparent <- function(someColor, alpha=100) scales::alpha(someColor, alpha/100)
3
Marek