Come creare grafica con sfondo trasparente in R usando ggplot2?


123

Ho bisogno di produrre grafica ggplot2 da R a file PNG con sfondo trasparente. Va tutto bene con la grafica R di base, ma nessuna trasparenza con ggplot2:

d <- rnorm(100) #generating random data

#this returns transparent png
png('tr_tst1.png',width=300,height=300,units="px",bg = "transparent")
boxplot(d)
dev.off()

df <- data.frame(y=d,x=1)
p <- ggplot(df) + stat_boxplot(aes(x = x,y=y)) 
p <- p + opts(
    panel.background = theme_rect(fill = "transparent",colour = NA), # or theme_blank()
    panel.grid.minor = theme_blank(), 
    panel.grid.major = theme_blank()
)
#returns white background
png('tr_tst2.png',width=300,height=300,units="px",bg = "transparent")
p
dev.off()

C'è un modo per ottenere uno sfondo trasparente con ggplot2?


3
Vedi anche questa risposta , la soluzione attuale è aggiungeretheme(panel.background = element_rect(fill = "transparent", colour = NA), plot.background = element_rect(fill = "transparent", colour = NA))
Paul Rougieux

Considera la possibilità di contrassegnare la seconda risposta (da YRC) come accettata poiché le "opzioni" sono obsolete.
Davit Sargsyan

Risposte:


70

Aggiornato con la theme()funzione ggsave()e il codice per lo sfondo della legenda:

df <- data.frame(y = d, x = 1, group = rep(c("gr1", "gr2"), 50))
p <- ggplot(df) +
  stat_boxplot(aes(x = x, y = y, color = group), 
               fill = "transparent" # for the inside of the boxplot
  ) 

Il modo più veloce è usare using rect, poiché tutti gli elementi rectangle ereditano da rect:

p <- p +
  theme(
        rect = element_rect(fill = "transparent") # all rectangles
      )
    p

Un modo più controllato è utilizzare le opzioni di theme:

p <- p +
  theme(
    panel.background = element_rect(fill = "transparent"), # bg of the panel
    plot.background = element_rect(fill = "transparent", color = NA), # bg of the plot
    panel.grid.major = element_blank(), # get rid of major grid
    panel.grid.minor = element_blank(), # get rid of minor grid
    legend.background = element_rect(fill = "transparent"), # get rid of legend bg
    legend.box.background = element_rect(fill = "transparent") # get rid of legend panel bg
  )
p

Per salvare (questo ultimo passaggio è importante):

ggsave(p, filename = "tr_tst2.png",  bg = "transparent")

1
Se non imposti il plot.backgroundcolore come la risposta sopra, la trama avrà un contorno debole.
jsta

87

C'è anche plot.backgroundun'opzione oltre a panel.background:

df <- data.frame(y=d,x=1)
p <- ggplot(df) + stat_boxplot(aes(x = x,y=y)) 
p <- p + opts(
    panel.background = theme_rect(fill = "transparent",colour = NA), # or theme_blank()
    panel.grid.minor = theme_blank(), 
    panel.grid.major = theme_blank(),
    plot.background = theme_rect(fill = "transparent",colour = NA)
)
#returns white background
png('tr_tst2.png',width=300,height=300,units="px",bg = "transparent")
print(p)
dev.off()

Per qualche motivo, l'immagine caricata viene visualizzata in modo diverso rispetto al mio computer, quindi l'ho omessa. Ma per me, ottengo una trama con uno sfondo completamente grigio ad eccezione della parte a scatola del grafico a scatole che è ancora bianca. Questo può essere cambiato anche usando l'estetica di riempimento nel boxplot geom, credo.

modificare

ggplot2 da allora è stato aggiornato e la opts()funzione è stata deprecata. Attualmente, useresti theme()invece di opts()e element_rect()invece di theme_rect(), ecc.


Non mi aspettavo che funzionasse con un Mac quando testato con l'attuale PowerPoint di quella piattaforma, ma funziona come pubblicizzato. E funziona anche con i PDF se rimuovi le unità e sostituisci le dimensioni in pollici. Buon lavoro.
IRTFM

1
Funziona perfettamente con MS Powerpoint 2010. In realtà, ne avevo bisogno proprio per questo scopo.
Yuriy Petrovskiy

13
Se stai usando ggsave, non dimenticare di aggiungere bg = "transparent"per passare al dispositivo grafico png.
Tom

12
se stai usando il knitrpacchetto (o slidifyecc.) devi passare dev.args = list(bg = 'transparent')come opzione di blocco. Maggiori dettagli qui stackoverflow.com/a/13826154/561698
Andrew

3

Solo per migliorare la risposta di YCR:

1) Ho aggiunto delle linee nere sugli assi xey. Altrimenti sono anche trasparenti.

2) Ho aggiunto un tema trasparente alla legenda. Altrimenti, otterrai un riempimento lì, che non sarà molto estetico.

Infine, nota che tutti funzionano solo con i formati pdf e png. jpeg non riesce a produrre grafici trasparenti.

MyTheme_transparent <- theme(
    panel.background = element_rect(fill = "transparent"), # bg of the panel
    plot.background = element_rect(fill = "transparent", color = NA), # bg of the plot
    panel.grid.major = element_blank(), # get rid of major grid
    panel.grid.minor = element_blank(), # get rid of minor grid
    legend.background = element_rect(fill = "transparent"), # get rid of legend bg
    legend.box.background = element_rect(fill = "transparent"), # get rid of legend panel bg
    legend.key = element_rect(fill = "transparent", colour = NA), # get rid of key legend fill, and of the surrounding
    axis.line = element_line(colour = "black") # adding a black line for x and y axis
)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.