it-swarm.com.de

Wie erstelle ich mit ggplot2 Grafiken mit transparentem Hintergrund in R?

Ich muss ggplot2-Grafiken von R in PNG-Dateien mit transparentem Hintergrund ausgeben. Alles ist in Ordnung mit grundlegenden R-Grafiken, aber keine Transparenz mit 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()

Gibt es eine Möglichkeit, mit ggplot2 transparenten Hintergrund zu erhalten?

112

Aktualisiert mit der Funktion theme(), ggsave() und dem Code für den Legendenhintergrund:

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
  ) 

Der schnellste Weg ist die Verwendung von rect, da alle Rechteckelemente von rect erben:

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

Eine kontrolliertere Methode ist die Verwendung der Optionen von 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

Speichern (dieser letzte Schritt ist wichtig):

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

Zusätzlich zu plot.background Gibt es eine panel.background - Option:

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()

Aus irgendeinem Grund wird das hochgeladene Bild anders angezeigt als auf meinem Computer, daher habe ich es weggelassen. Aber für mich bekomme ich einen Plot mit einem völlig grauen Hintergrund, mit Ausnahme des Box-Teils des Boxplots, der immer noch weiß ist. Ich glaube, das kann auch mit der Füllästhetik im Boxplot-Geom geändert werden.

Bearbeiten

ggplot2 wurde inzwischen aktualisiert und die Funktion opts() ist veraltet. Derzeit würden Sie theme() anstelle von opts() und element_rect() anstelle von theme_rect() usw. verwenden.

85
joran

Um die Antwort von YCR zu verbessern:

1) Ich habe schwarze Linien auf der x- und y-Achse hinzugefügt. Ansonsten werden sie auch transparent gemacht.

2) Ich habe dem Legendenschlüssel ein transparentes Thema hinzugefügt. Andernfalls erhalten Sie dort eine Füllung, die nicht sehr ästhetisch ist.

Beachten Sie schließlich, dass alle diese nur mit den Formaten pdf und png funktionieren. JPEG erzeugt keine transparenten Grafiken.

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
)
2
Rtist