155 votes

Comment faire des graphiques avec un fond transparent dans R en utilisant ggplot2 ?

J'ai besoin de sortir des graphiques ggplot2 de R vers des fichiers PNG avec un fond transparent. Tout est ok avec les graphiques de base de R, mais pas de transparence avec 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()

Existe-t-il un moyen d'obtenir un fond transparent avec ggplot2 ?

6 votes

Voir aussi cette réponse la solution actuelle consiste à ajouter theme(panel.background = element_rect(fill = "transparent", colour = NA), plot.background = element_rect(fill = "transparent", colour = NA))

0 votes

Veuillez envisager de marquer la deuxième réponse (par YRC) comme acceptée, car "opts" est obsolète.

107voto

YCR Points 1721

Mis à jour avec le theme() fonction, ggsave() et le code pour le fond de la légende :

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
  ) 

Le moyen le plus rapide est d'utiliser rect car tous les éléments du rectangle héritent de rect :

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

Une manière plus contrôlée est d'utiliser les options de 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

Pour sauvegarder (cette dernière étape est importante) :

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

2 votes

Si vous ne définissez pas l'option plot.background couleur comme la réponse ci-dessus, votre parcelle aura un léger contour.

1 votes

Ahhh... j'ai passé trop de temps à ne pas connaître la dernière étape. Sauvegarde du fichier avec , bg = "transparent".

91voto

joran Points 68079

Il existe également un plot.background en plus de l'option 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()

Pour une raison quelconque, l'image téléchargée ne s'affiche pas de la même manière que sur mon ordinateur, je l'ai donc omise. Mais pour moi, j'obtiens un tracé avec un fond entièrement gris, sauf pour la partie boîte du boxplot qui est toujours blanche. Cela peut être changé en utilisant l'esthétique de remplissage dans le géomètre boxplot aussi, je crois.

Modifier

ggplot2 a depuis été mis à jour et le opts() a été dépréciée. Actuellement, vous devez utiliser theme() au lieu de opts() y element_rect() au lieu de theme_rect() etc.

0 votes

Je ne m'attendais pas à ce qu'il fonctionne avec un Mac lorsqu'il a été testé avec le PowerPoint actuel de cette plateforme, mais il fonctionne comme annoncé. Et il fonctionne aussi avec les pdf si on enlève les unités et qu'on remplace les tailles en pouces Bon travail.

1 votes

Cela fonctionne parfaitement avec MS Powerpoint 2010. En fait, j'en avais besoin dans ce but.

15 votes

Si vous utilisez ggsave, n'oubliez pas d'ajouter la fonction bg = "transparent" à passer au périphérique graphique png.

6voto

Rtist Points 391

Juste pour améliorer la réponse d'YCR :

1) J'ai ajouté des lignes noires sur les axes x et y. Sinon, elles sont aussi rendues transparentes.

2) J'ai ajouté un thème transparent à la clé de légende. Sinon, vous aurez un remplissage à cet endroit, ce qui ne sera pas très esthétique.

Enfin, notez que tous ces éléments ne fonctionnent qu'avec les formats pdf et png. Le format jpeg ne permet pas de produire des graphiques transparents.

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
)

0voto

Qinsi Points 457

Pour ceux qui n'aiment pas les fonds gris comme les rédacteurs universitaires, essayez ceci :

p <- p + theme_bw()
p

1 votes

theme_bw donne un fond blanc, pas un fond transparent.

0voto

Sara Points 71

Le paquet Cairo peut être utilisé pour sauvegarder les ggplots en tant qu'images avec un fond transparent. https://cran.r-project.org/web/packages/Cairo/Cairo.pdf

CaiorPNG(filename = "TEST.png", bg = "transparent")

ggplot(mtcars, aes(wt, mpg))+
   geom_point()+
   theme(panel.background = element_rect(fill = "transparent"),
      plot.background = element_rect(fill = "transparent", colour = NA))

dev.off()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X