2012-12-22 2 views
6

Quando si utilizza un tema ggplot2 con uno sfondo nero, è possibile controllare il colore della legenda per guide diverse dalla guida del colore in modo che le cose non vengano tracciate in nero? Se é cosi, come?Colore di controllo degli elementi della legenda che non sono guide colore in ggplot

library(ggplot2) # needs to be 0.9.3 for this theme 
data(iris)  # included with ggplot2 

theme_black<- function (base_size = 16, base_family = ""){ 
    theme_minimal() %+replace% 
     theme(
       line = element_line(colour = "white", size = 0.5, linetype = 1, 
         lineend = "butt"), 
       rect = element_rect(fill = "white", 
         colour = "white", size = 0.5, linetype = 1), 
       text = element_text(family = base_family, 
         face = "plain", colour = "white", size = base_size, 
         angle = 0, lineheight = 0.9, hjust = 0, vjust = 0), 
       plot.background = element_rect(colour = 'black', fill = 'black'), 
       plot.title = element_text(size = rel(1.2)), 
       panel.border = element_rect(fill = NA, colour = "white"), 
       panel.grid.major = element_line(colour = "grey20", size = 0.2), 
       panel.grid.minor = element_line(colour = "grey5", size = 0.5), 
       strip.background = element_rect(fill = "grey30", colour = "grey30") 
      ) 
    } 

ggplot(data=iris, aes(x=Sepal.Length, y=Sepal.Width, shape=Species, 
     colour=Petal.Length))+geom_point()+theme_black()+ 
     scale_colour_gradient(low = "purple", high = "white") 

Come si può vedere, il colore predefinito per la parte forma della leggenda non è stato modificato, quindi è invisibile e non si può dire quale specie è che:

enter image description here

Il l'unica soluzione che ho ora è quella di cambiare il colore di legend.background, ma questo è uno spreco di inchiostro e brutto.

+1

Ecco una correzione parziale: '+ guide (shape = guide_legend (override.aes ​​= list (color =" white ")))'. Sfortunatamente, 'theme()' non può essere usato per cambiare cose come il colore punto predefinito. – bdemarest

+0

Grazie per questa risposta (+1). Penso che varrebbe la pena di aggiungere una risposta: lo manterrò sicuramente. – MattBagg

risposta

1

Un modo potrebbe essere quello di aggiungere due ulteriori geom_point s, la logica sarebbe:

trama punti bianchi per la leggenda, coprirli con punti neri senza leggenda, poi tracciare i punti colorati senza leggenda, per es.

geom_point(colour="white",size=1) + 
geom_point(colour="black",size=3,show_guide=FALSE) + 
geom_point(show_guide=FALSE) 
+0

Grazie per la risposta! (Perché avresti bisogno del geom_point nero poiché quello superiore copre comunque quello bianco? Hai notato casi in cui i white show sui bordi?) ... Spero che esista una soluzione in cui i temi che cambiano non ci costringono a aggiungi strati extra al nostro codice. – MattBagg

+0

sì, mi sono accorto quando ho tracciato una copertura incompleta dei punti. Finché la dimensione è diversa sarà ok e forse salterà il nero (suppongo che l'opzione punto nero sia lì se non vuoi essere vincolato nelle dimensioni dei punti per i tuoi punti coloued) –

2

La risposta breve sembra essere che non esiste un modo perfetto per farlo.

Possiamo aggiungere livelli nascosti con guide di forma come da @ user1317221_G's risposta, che ho accettato. Ma è un calcolo extra e se salviamo come pdf, prevedo che questi livelli nascosti saranno presenti.

In alternativa, possiamo ignorare il colore della guida forma, come @bdemarest suggerisce nei commenti:

+ guides(shape=guide_legend(override.aes=list(colour="white")) 

Ma questo ancora ci costringe ad aggiungere codice specifico tema oltre appena il + theme_black()

Ho implementato una versione leggermente più elaborata di questo perché ho impostato un tema predefinito per la sessione a seconda che stia realizzando grafici per carta (sfondo grigio/bianco) o schermo (sfondo nero). Quindi il mio approccio è quello di eseguire qualcosa in questo senso all'inizio della sessione:

set_theme(theme_black); defaultcol = "white" # for slides 
# or 
set_theme(theme_bw); defaultcol = "black" # for paper 

seguito da un ggplot() che include questo:

+ guides(shape=guide_legend(override.aes=list(colour=defaultcol)) 

Questo ha il vantaggio di ridurre al minimo la necessità di tema- aggiustamenti specifici ai grafici, anche se non è buono come essere in grado di controllare il colore ggplot2 predefinito con un tema.