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

123

Ich muss ggplot2-Grafiken von R in PNG-Dateien mit transparentem Hintergrund ausgeben. Mit einfachen R-Grafiken ist alles in Ordnung, aber mit ggplot2 keine Transparenz:

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 einen transparenten Hintergrund zu erhalten?

Yuriy Petrovskiy
quelle
3
Siehe auch diese Antwort , die aktuelle Lösung ist hinzuzufügentheme(panel.background = element_rect(fill = "transparent", colour = NA), plot.background = element_rect(fill = "transparent", colour = NA))
Paul Rougieux
Bitte erwägen Sie, die zweite Antwort (von YRC) als akzeptiert zu markieren, da "Optionen" veraltet sind.
Davit Sargsyan

Antworten:

70

Aktualisiert mit der theme()Funktion 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 using rect, da alle Rechteckelemente von rect erben:

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

Eine kontrolliertere Möglichkeit besteht darin, folgende Optionen zu verwenden 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")
YCR
quelle
1
Wenn Sie die plot.backgroundFarbe nicht wie in der Antwort oben einstellen, hat Ihr Plot einen schwachen Umriss.
Jsta
87

Es gibt auch eine plot.backgroundOption zusätzlich zu 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()

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

Bearbeiten

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

Joran
quelle
Ich hatte nicht erwartet, dass es mit einem Mac funktioniert, wenn es mit dem aktuellen PowerPoint dieser Plattform getestet wurde, aber es funktioniert wie angekündigt. Und es funktioniert auch mit PDFs, wenn Sie die Einheiten entfernen und Größen in Zoll ersetzen. Gute Arbeit.
IRTFM
1
Dies funktioniert hervorragend mit MS Powerpoint 2010. Eigentlich brauchte ich es richtig für diesen Zweck.
Yuriy Petrovskiy
13
Wenn Sie ggsave verwenden, vergessen Sie nicht, diese hinzuzufügen bg = "transparent", um sie an das PNG-Grafikgerät weiterzuleiten.
Tom
12
Wenn Sie das knitrPaket (oder slidifyusw.) verwenden, müssen Sie es dev.args = list(bg = 'transparent')als Chunk-Option übergeben. Weitere Details hier stackoverflow.com/a/13826154/561698
Andrew
3

Nur 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
)
Rtist
quelle