Bagaimana cara membuat grafik dengan background transparan di R menggunakan ggplot2?

123

Saya perlu mengeluarkan grafik ggplot2 dari file R ke PNG dengan latar belakang transparan. Semuanya baik-baik saja dengan grafik R dasar, tetapi tidak ada transparansi dengan 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()

Apakah ada cara untuk mendapatkan latar belakang transparan dengan ggplot2?

Yuriy Petrovskiy
sumber
3
Lihat juga jawaban ini , solusi saat ini adalah menambahkantheme(panel.background = element_rect(fill = "transparent", colour = NA), plot.background = element_rect(fill = "transparent", colour = NA))
Paul Rougieux
Harap pertimbangkan untuk menandai jawaban kedua (oleh YRC) sebagai diterima karena 'pilihan' sudah tidak berlaku.
Davit Sargsyan

Jawaban:

70

Diperbarui dengan theme()fungsi, ggsave()dan kode untuk latar belakang 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
  ) 

Cara tercepat adalah menggunakan menggunakan rect, karena semua elemen persegi panjang diturunkan dari persegi:

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

Cara yang lebih terkontrol adalah dengan menggunakan opsi 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

Untuk menyimpan (langkah terakhir ini penting):

ggsave(p, filename = "tr_tst2.png",  bg = "transparent")
YCR
sumber
1
Jika Anda tidak mengatur plot.backgroundwarna seperti jawaban di atas, plot Anda akan memiliki outline yang samar.
jsta
87

Ada juga plot.backgroundopsi selain 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()

Untuk beberapa alasan, tampilan gambar yang diunggah berbeda dari pada komputer saya, jadi saya telah menghilangkannya. Tapi bagi saya, saya mendapatkan plot dengan background yang seluruhnya abu-abu kecuali untuk bagian kotak dari boxplot yang masih putih. Itu bisa diubah menggunakan estetika isian di boxplot geom juga, saya yakin.

Sunting

ggplot2 telah diperbarui dan opts()fungsinya sudah tidak digunakan lagi. Saat ini, Anda akan menggunakan theme()alih- alih opts()dan element_rect()alih-alih theme_rect(), dll.

joran
sumber
Saya tidak mengharapkannya untuk bekerja dengan Mac ketika diuji dengan platform PowerPoint saat ini tetapi berfungsi seperti yang diiklankan. Dan itu bekerja dengan pdf juga jika Anda menghapus unit dan ukuran pengganti dalam inci. Kerja bagus.
IRTFM
1
Ini bekerja sangat baik dengan MS Powerpoint 2010. Sebenarnya, saya membutuhkannya dengan benar untuk tujuan ini.
Yuriy Petrovskiy
13
Jika Anda menggunakan ggsave, jangan lupa menambahkan bg = "transparent"untuk meneruskan ke perangkat grafis png.
Tom
12
jika Anda menggunakan knitrpaket (atau slidifylain - lain), Anda harus mengirimkannya dev.args = list(bg = 'transparent')sebagai opsi potongan. Lebih detail di sini stackoverflow.com/a/13826154/561698
Andrew
3

Hanya untuk meningkatkan jawaban YCR:

1) Saya menambahkan garis hitam pada sumbu x dan y. Kalau tidak, mereka juga dibuat transparan.

2) Saya menambahkan tema transparan ke kunci legenda. Jika tidak, Anda akan mendapatkan kepuasan di sana, yang tidak akan terlalu estetis.

Terakhir, perhatikan bahwa semua itu hanya berfungsi dengan format pdf dan png. jpeg gagal menghasilkan grafik transparan.

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
sumber