2012-02-03 12 views
6

Vorrei creare una legenda per un diagramma di vignaiolo. Questo dovrebbe essere semplice in quanto la funzione fuuler restituisce i colori usati per la console. I colori hanno un valore compreso tra 0 e 1. Voglio sapere come trasformare quei valori numerici memorizzati in $ colori in qualcosa che posso usare per riempire l'argomento fill nella legenda.legenda diagramma di venn in trovatore

Ho tentato questo di seguito utilizzando i colori $ estratti da finitouler e indicizzazione da colors(). So che questo non è corretto perché colors() è indicizzato con valori di intervallo, ma inseritelo per mostrare cosa mi piacerebbe.

set.seed(20) 
x <- matrix(sample(0:1, 100, replace = TRUE), 10, 10) 
colnames(x) <- LETTERS[1:10] 
rownames(x) <- letters[1:10] 

require(venneuler) 
y <- venneuler(x) 
plot(y) 

y$colors 

legend(.05, .9, legend = colnames(x), fill = colors()[y$colors]) 

risposta

8

Con indagando plot.VennDiagram ed i suoi valori di default si può vedere come converte i numeri in y$colors a rgb stringhe di colore. (Prova getAnywhere("plot.VennDiagram") per dare un'occhiata.)

Qui ho raccolto i due bit di codice che hanno elaborato i colori (nel tuo caso) in una singola funzione che eseguirà la conversione per te. Il posizionamento della leggenda probabilmente potrebbe essere migliorata, ma questo è un altro problema ...

col.fn <- function(col, alpha=0.3) { 
    col<- hcl(col * 360, 130, 60) 
    col <- col2rgb(col)/255 
    col <- rgb(col[1, ], col[2, ], col[3, ], alpha) 
    col 
} 

COL <- col.fn(y$colors) 
# The original order of columns in x is jumbled in the object returned 
# by venneuler. This code is needed to put the colors and labels back 
# in the original order (here alphabetical). 
LABS <- y$labels 
id <- match(colnames(x), LABS) 

plot(y) 
legend(.05, .9, legend = LABS[id], fill = COL[id], x="topleft") 

enter image description here

+0

O'Brian Che è perfetto. –

+0

Ho usato 'id <- corrisponde (nomi (y $ colors, LAB))' invece –

Problemi correlati