Ggplot2 kullanarak R'de şeffaf arkaplanlı grafikler nasıl yapılır?


123

Ggplot2 grafiklerini R'den PNG dosyalarına şeffaf arka plana sahip çıktı vermem gerekiyor. Temel R grafiklerinde her şey yolunda, ancak ggplot2 ile şeffaflık yok:

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

Ggplot2 ile şeffaf arka plan elde etmenin bir yolu var mı?


3
Bu yanıta da bakın , mevcut çözüm eklemektirtheme(panel.background = element_rect(fill = "transparent", colour = NA), plot.background = element_rect(fill = "transparent", colour = NA))
Paul Rougieux

Lütfen ikinci yanıtı (YRC tarafından) 'seçenekler' geçersiz olduğu için kabul edildi olarak işaretlemeyi düşünün.
Davit Sargsyan

Yanıtlar:


70

theme()İşlev ggsave()ve açıklama arka plan kodu ile güncellendi :

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
  ) 

rectTüm dikdörtgen elemanlar rect'ten miras aldığından en hızlı yol kullanmaktır :

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

Daha kontrollü bir yol şu seçenekleri kullanmaktır 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

Kaydetmek için (bu son adım önemlidir):

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

1
plot.backgroundRengi yukarıdaki cevap gibi ayarlamazsanız, arsanızın soluk bir çerçevesi olacaktır.
jsta

87

Aşağıdakilere plot.backgroundek olarak bir seçenek de vardır 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()

Bazı nedenlerden dolayı, yüklenen görüntü bilgisayarımdakinden farklı görüntüleniyor, bu yüzden onu atladım. Ama benim için, kutu grafiğinin hala beyaz olan kutu kısmı dışında tamamen gri bir arka plana sahip bir olay örgüsü elde ediyorum. Bunun boxplot geom'daki dolgu estetiği kullanılarak da değiştirilebileceğine inanıyorum.

Düzenle

ggplot2 o zamandan beri güncellendi ve opts()işlev kullanımdan kaldırıldı. Şu anda, theme()yerine opts()ve element_rect()yerine theme_rect()vb. Kullanırsınız.


Bu platformun mevcut PowerPoint'iyle test edildiğinde bir Mac ile çalışmasını beklemiyordum ama reklamı yapıldığı gibi çalışıyor. Ve birimleri kaldırırsanız ve boyutları inç olarak değiştirirseniz pdf'lerle de çalışır. İyi iş.
IRTFM

1
Bu MS Powerpoint 2010 ile mükemmel çalışıyor. Aslında bu amaç için ona ihtiyacım vardı.
Yuriy Petrovskiy

13
Ggsave kullanıyorsanız bg = "transparent", png grafik cihazına eklemek için eklemeyi unutmayın .
Tom

12
knitrPaketi (veya slidifyvb.) kullanıyorsanız, dev.args = list(bg = 'transparent')yığın seçeneği olarak geçmeniz gerekir . Daha fazla ayrıntı burada stackoverflow.com/a/13826154/561698
Andrew

3

YCR'nin cevabını iyileştirmek için:

1) x ve y eksenine siyah çizgiler ekledim. Aksi takdirde onlar da şeffaf hale getirilir.

2) Efsane anahtarına şeffaf bir tema ekledim. Aksi takdirde orada çok estetik olmayacak bir dolgu elde edersiniz.

Son olarak, tüm bunların yalnızca pdf ve png formatlarıyla çalıştığını unutmayın. jpeg saydam grafikler üretemez.

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
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.