2011-11-08 11 views
41

Ho avuto questo alcune volte, quindi ecco: sto facendo alcuni grafici che tengono curve con le stime di un parametro dato un parametro di sintonia.Equivalente trasparente di un dato colore

In genere, dispongo anche di SD per ciascun valore stimato, pertanto è possibile visualizzare barre di errore attorno a ciascuna di esse.

Tuttavia, non mi piacciono le barre di errore, e preferirei una versione livellata di esso. Questo non è di per sé un problema (es. So come farlo). Tuttavia, la mia trama contiene molte di queste curve simili, ognuna con il proprio colore. Quindi vorrei aggiungere "l'errorregion levigata" a ciascuna curva in un colore che corrisponda al colore della curva stessa. Certo, mi piacerebbe farlo in modo un po 'trasparente, così posso ancora vedere le altre curve attraverso la' regione di errore '.

Quindi, la mia domanda è: dato un colore (specificato da un numero, un nome o un valore rgb --- nota che i primi due pongono un problema in più, ma questo si verifica piuttosto spesso, come le funzioni di tracciamento di base prendi questi come valori di colore validi), come posso trovare trovare il colore corrispondente che ha lo stesso rgb ma un livello alfa diverso (dato) (trasparenza). Vorrei una funzione come:

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

Questo dovrebbe funzionare per cose come:

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

Edit Odio quando mi manca qualcosa di ovvio, ma @themel mi ha segnalato ad esso (thx di nuovo). Ecco una soluzione completa (nota: opere vettoriale, in modo da poter passare più di un colore, un solo alfa è supportata in questo momento però):

#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 :: alfa()' forse? – baptiste

+2

C'è anche 'alpha' in' scale ', forse sono correlati. Quella è bilancia ha un'interfaccia davvero bella. È abbastanza flessibile nei suoi input.Penso che qualsiasi espressione della forma 'plot (data, col = colors)' possa essere sostituita con 'plot (data, col = alpha (colors, 0.5))' per ottenere il 50% di trasparenza. Questo funziona anche se 'colors' è semplicemente un vettore di numeri interi che selezionano un colore dalla tavolozza standard. –

+0

in qualche modo collegato (secondo Google in ogni caso) e che ho trovato molto utile: https://gist.github.com/mages/5339689/raw/576263b8f0550125b61f4ddba127f5aa00fa2014/add.alpha.R – PatrickT

risposta

36

Avete dato un'occhiata al ?rgb?

utilizzati:

RGB (rosso, verde, blu, alfa, nomi = NULL, maxColorValue = 1)

Un valore di trasparenza alfa può essere specificato (come opacità, così ' 0 'significa completamente trasparente e' max 'significa opaco). Se alpha 'non è specificato, viene generato un colore opaco.

Il parametro alpha serve per specificare la trasparenza. col2rgb divide i colori R specificati in altri modi in RGB in modo da poterli inviare a rgb.

+0

'col2rgb' era la cosa che mi mancava - devo averlo letto sopra :-(Inoltre non mi sarei mai aspettato che questo funzionasse su colori già in formato rgb.To modificherò la mia domanda per includere una risposta completa basata sul tuo. –

+0

Non sapeva di 'col2rgb' , che è davvero utile! –

+1

Nel mio caso era anche necessario trasporre il valore restituito col2rgb() e passare l'argomento maxColorValue per la normalizzazione: rgb (t (col2rgb (c ("rosso", "verde"))), alfa = 100 , maxColorValue = 255) –

3

Penso che sia più comune specificare alpha in [0,1]. Questa funzione farlo, più accettare diversi colori come argomenti:

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) 

} 

E, alla prova:

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

C'è una funzione adjustcolor in grDevices pacchetto, che funziona così nel tuo caso:

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

Molto semplice e facile da usare: bello per me, grazie. – jcfaria

Problemi correlati