2016-01-05 2 views
5

C'è un modo per rendere le linee geom_boxplot linee, baffi e punti anomali ereditare lo stesso alpha assegnato al grafico a scatole fill nella trama seguente?geom_boxplot: mappa i livelli alfa in baffi e valori anomali

+0

potresti voler dare un'occhiata a [questa domanda] (http://stackoverflow.com/questions/34601194/change-colours-to-defined-palette-for-ggplot-objects) da oggi in poi – mtoto

risposta

3

non sono sicuro se c'è un modo naturale per farlo entro ggplot2, ma ecco un modo hacky: L'estetica del colore determina il colore delle linee, baffi, e punti esterni. Quindi aggiungeremo un'estetica del colore alla trama. Tuttavia, imposteremo i colori manualmente in modo che includano la sequenza di valori alfa nelle definizioni dei colori. Di conseguenza, aggiungiamo efficacemente valori alfa all'estetica del colore. Ho mappato l'estetica a Species in modo che possa avere tre diversi livelli alfa per l'illustrazione e aggiunto theme_bw() per un migliore contrasto dei valori alfa.

In primo luogo, impostare i valori alfa che vogliamo nel grafico finale:

numVals = length(unique(iris$Species)) 
avals = seq(0.9, 0.3, length.out=numVals) 

Ecco l'hack: Impostare i tutti i colori al nero, ma aggiungere la sequenza a livello di alfa per la definizione del colore. Per questo, abbiamo bisogno di convertire i livelli alfa in esadecimali su una scala 0 - 255.

avalsHex = paste0("#000000", toupper(as.hexmode(round(avals*255)))) 

Nel codice precedente, avals*255 sono i livelli di alfa su una scala 0 - 255. as.hexmode converte quei valori in esadecimali. toupper non è strettamente necessario, ma sono abituato a vedere le definizioni esadecimali dei colori in maiuscolo. Quindi incolliamo il valore alfa esadecimale a due cifre sulla fine del colore, in questo caso nero (#000000), che fornisce un vettore di tre colori che includono valori alfa.

Nessun complotto ci sia con il colore e alfa estetica ei valori manuali per ogni estetica:

ggplot(iris, aes(x = Species, y = Sepal.Length)) + 
    geom_boxplot(aes(color=Species, alpha = Species)) + 
    scale_alpha_manual(values = avals) + 
    scale_colour_manual(values = avalsHex) 

enter image description here

AGGIORNAMENTO: Per affrontare il tuo commento, ecco un esempio con colori diversi in Oltre ai valori alpha:

avalsHex = paste0(c("#FF0000","#00FF00","#0000FF"), toupper(as.hexmode(round(avals*255)))) 

Quindi eseguire lo stesso codice di traccia per ottenere:

enter image description here

UPDATE 2: Pensando a colori mi ha fatto capire che non è nemmeno necessario la conversione in esadecimale di aggiungere i valori alfa. Ad esempio, con i colori hcl si può fare questo:

# Black boxplots with 3 different alpha levels 
scale_colour_manual(values = hcl(0,0,0, alpha=avals)) 

# Colored boxplots with 3 different alpha levels 
scale_colour_manual(values=hcl(seq(15,375,length.out=4)[1:3], 100, 65, alpha=avals)) 

La funzione hcl restituisce il codice di esa decimale per ogni colore, in effetti curando la conversione per voi.

+0

Non come hacky come temevo! Se avessi un vettore di colori di riempimento diversi (cioè non tutti iniziando da "# 000000'), questo metodo funzionerebbe ancora?(scusa, la prima frase è stata pubblicata prematuramente) – mdlincoln

+0

Beh, mantiene lo spirito della grammatica di 'ggplot', ma devi andare al di fuori del normale flusso di lavoro ggplot per farlo funzionare. – eipi10

+1

Per rispondere al resto del tuo commento: Sì. Puoi attaccare qualsiasi livello alfa che desideri su qualsiasi colore esadecimale aggiungendo le ulteriori due cifre esadecimali. Vedi l'aggiornamento per un semplice esempio. – eipi10