J'ai besoin de générer des graphiques ggplot2 de R vers des fichiers PNG avec un arrière-plan transparent. Tout est ok avec les graphiques de base 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()
Y a-t-il un moyen d'obtenir un fond transparent avec ggplot2?
Mis à jour avec la fonction theme()
, ggsave()
et le code pour l'arrière-plan 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 consiste à utiliser rect
, car tous les éléments rectangulaires héritent de rect:
p <- p +
theme(
rect = element_rect(fill = "transparent") # all rectangles
)
p
Une manière plus contrôlée consiste à 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")
Il existe également une option plot.background
En plus de 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 s'affiche différemment que sur mon ordinateur, je l'ai donc omise. Mais pour moi, je reçois une parcelle avec un fond entièrement gris, à l'exception de la partie boîte de la boîte à moustaches qui est toujours blanche. Je crois que cela peut être changé en utilisant l'esthétique de remplissage du geom de la boîte à moustaches.
Éditer
ggplot2 a depuis été mis à jour et la fonction opts()
est obsolète. Actuellement, vous utiliseriez theme()
au lieu de opts()
et element_rect()
au lieu de theme_rect()
, etc.
Juste pour améliorer la réponse de YCR:
1) J'ai ajouté des lignes noires sur les axes x et y. Sinon, ils sont également transparents.
2) J'ai ajouté un thème transparent à la légende. Sinon, vous obtiendrez un remplissage, ce qui ne sera pas très esthétique.
Enfin, notez que tous ne fonctionnent qu'avec les formats pdf et png. jpeg ne parvient pas à 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
)