2015-09-06 16 views
13

Questo potrebbe essere principalmente il risultato di una mia incomprensione su come panel.margin = unit(...) funziona nella funzione theme() ... ma non sono in grado di personalizzare i margini in facet_wrap nel modo desiderato. Fondamentalmente, voglio un facet_grid che assomigli a questo, con il facet text (es. strip.text) inserito in ogni facet e senza spcaing tra ogni facet:In ggplot2 e facet_wrap, come rimuovere tutti i margini e il padding e mantenere strip.text?

(Ho lasciato nei bordi rosa per mostrare le dimensioni di ogni sfaccettatura)

The ideal final product

quindi, ecco il codice finora.

Per impostare il backup dei dati e la trama:

library(ggplot2) 
library(grid) 
p <- ggplot() + 
    geom_bar(data = mtcars, aes(x = cyl, y = qsec), stat = 'identity') + 
    facet_wrap(~ carb, ncol = 3) 

mytheme <- theme_minimal() + theme(
    axis.text.x = element_blank(), 
    axis.text.y = element_blank(), 
    axis.ticks = element_blank(), 
    axis.title = element_blank(), 
    panel.margin = unit(0, "lines"), 
    panel.border = element_rect(colour = rgb(1.0, 0, 0, 0.5), fill=NA, size=1) 
) 
La trama di serie
p + mytheme 

just a standard plot

Rimozione del strip.text completamente
p + mytheme + theme(strip.text = element_blank()) 

no strip text

Aggiunta del strip.text e insetting esso
p + mytheme + 
    theme(strip.text = element_text(size = rel(3.0), vjust = -4.0)) 

test grid inset text

Il reinserimento di strip.text (e la maggiore dimensione relativa) aumenta il margine verticale tra le due file. Quindi, a questo punto, non so come chiudere lo spazio verticale tra le righe superiore e inferiore.

Troppo margine negativo
p + mytheme + 
    theme(strip.text = element_text(size = rel(3.0), vjust = -4.0), 
      panel.margin = unit(c(-2, -2), "lines")) 

Too much negative margin

Così Come faccio a indirizzare solo il panel.margin tra le due file?

Modifica: Ulteriori informazioni. Lo spazio tra le file sembra essere strip.background:

p + mytheme + 
     theme(strip.text = element_text(size = rel(3.0), vjust = -4.0), 
       panel.margin = unit(-1, "lines"), 
       strip.background = element_rect(fill = rgb(0, 1.0, 0, 0.2))) 

enter image description here

+2

Se si utilizza 'panel.margin.y = unit (-2, "lines") ', diminuisci solo lo spazio tra le righe. E 'quello che stavi cercando o c'era qualcos'altro? – maj

+0

@maj ... non ... non può essere così semplice ... ma lo era. Immagino di averlo perso nella documentazione da qualche parte. Puoi ripubblicare il tuo commento come risposta in modo che io possa accettarlo? –

+0

@maj nel mio sistema ho bisogno di 'panel.margin.y = unità (-0.5," linee ")' per ottenere il risultato desiderato – Jaap

risposta

7

Tra l'elenco di possibili argomenti per theme(), non esiste solo panel.margin ("margine attorno pannelli faccette (unità)", vedi ?theme) ma, convenientemente, è anche possibile accedere a uno degli assi alla volta, rispettivamente con panel.margin.x e panel.margin.y ("margine orizzontale/verticale attorno ai pannelli delle faccette (unità; eredita da panel.margin)").

Pertanto, riducendo il margine di sotto dello zero si sente un po 'come un hack, qualcosa di simile alla seguente farà il lavoro (potrebbe essere necessario regolare il valore di un po' - unit(-2, "lines") lavorato meglio per me):

p + theme(strip.text = element_text(size = rel(3.0), vjust = -4.0), 
      panel.margin.y = unit(-2, "lines")) 

Se si utilizza strip.text = element_blank(), probabilmente si dovrebbe usare panel.margin.y = unit(-0.5, "lines").

Problemi correlati