2015-08-28 6 views
35

Come posso aumentare lo spazio tra i tasti della legenda del grafico ggplot2?ggplot2 aumenta lo spazio tra i tasti della legenda

library(ggplot2) 
ggplot(aes(mpg, wt, colour = factor(cyl)), 
     , data = mtcars) + 
     geom_point() + 
    theme(legend.direction = "horizontal", 
     legend.position = "bottom") + 
    guides(color = guide_legend(nrow=2)) 

enter image description here

Sto cercando una soluzione ggplot2 che aggiunge una sorta di regolazione verticale tra (tasto 4 e il tasto 6) nella trama di cui sopra? Devo creare una chiave della legenda personalizzata?

PS: Voglio aumentare lo spazio tra le caselle non tra le etichette.

la trama desiderata è:

enter image description here

NOTA: No la questione non viene duplicato dell'altro domanda. Vogliamo qui aggiungere una spaziatura verticale tra elementi che sono già in più righe. Nell'altra domanda abbiamo una legenda a 1 riga e vogliamo aggiungere spazi (orizzontali) tra gli elementi.

+1

Possibile duplicato di [questo] (http://stackoverflow.com/ domande/11366964/è-ci-a-way-to-change-the-distanza-tra-legend-elementi-in-ggplot2). Questo ha risolto il tuo problema? – Heroka

+0

@Heroka no.it non è un duplicato. Non voglio cambiare la dimensione della chiave. solo lo spazio tra i tasti. Puoi provare la soluzione nel link per verificarlo. – agstudy

+0

'grid' o' gridExtra' potrebbe aiutare, non li ho mai usati molto però ... [La vignetta 'gridExtra'] (https://github.com/baptiste/gridextra/wiki/arrange-ggplot#Legends) sembra in qualche modo promettente, ma è lungi dall'offrire una soluzione chiara. – maj

risposta

39

Un'alternativa (e probabilmente più facile) soluzione sta usando legend.key e legend.key.size nella theme parte del codice:

ggplot(data = mtcars, aes(mpg, wt, colour = factor(cyl))) + 
    geom_point() + 
    guides(color = guide_legend(nrow = 2)) + 
    theme(legend.direction = 'horizontal', 
     legend.position = 'bottom', 
     legend.key = element_rect(size = 5), 
     legend.key.size = unit(1.5, 'lines')) 

questo dà:

enter image description here


Nel caso in cui si sta chiamando o theme_bwtheme_classic prima di manipolare la leggenda, è necessario impostare il colore del rettangolo leggenda:

legend.key = element_rect(size = 5, color = 'white') #or: color = NA 
+0

Puoi spiegare la differenza tra la proprietà size di 'legend.key' e la proprietà' lines' di 'legend.key.size'. Quale controlla la spaziatura tra i tasti (ad esempio, le caselle grigie + l'etichetta)? –

+0

@BerkU. Il parametro 'size' di' legend.key' determina la dimensione della linea di confine. La proprietà 'lines' di' legend.key.size' determina la dimensione dell'intera scatola. – Jaap

+0

Questo non ha risolto la mia situazione, perché le '' linee'' hanno aumentato alcuni simboli delle legende insieme alla scatola.Nella mia situazione, il simbolo del punto non è aumentato (come nel tuo esempio) ma il simbolo della linea lo ha fatto. Dato che le mie linee erano verticali, la casella diventava sempre più alta man mano che le "linee" erano aumentate, senza aumentare lo spazio tra le due colonne della legenda. Riferirò se trovo una soluzione. – PatrickT

7

Qui una soluzione utilizzando gtable. Fondamentalmente sto estraendo la tabella delle legende e aggiungo una riga nella tabella delle legende.

library(gtable) 
library(grid) 
## transform the ggplot to a grobs table 
p_table <- ggplot_gtable(ggplot_build(p)) 
## extract legend 
leg <- which(sapply(p_table$grobs, function(x) x$name) == "guide-box") 
## this is the tricky part ! 
## add a row in the second position (pos=2) 
p_table$grobs[[leg]]$grobs[[1]] <- 
    gtable_add_rows(p_table$grobs[[leg]]$grobs[[1]], 
        unit(0.5, "line"), ## you can increase the height here 
        pos=2)    ## since I have 2 rows , I insert it in the middle 
plot(p_table) 

PS: I dont' know qui come costringere il tavolo per una trama di nuovo! forse qualcun altro può aiutare qui (io sono solo tramando e perdere la struttura dell'oggetto)

enter image description here