web-dev-qa-db-ja.com

ggplot2を使用してRで透明な背景を持つグラフィックを作成する方法は?

Rからggplot2グラフィックスを透明な背景を持つPNGファイルに出力する必要があります。基本的なRグラフィックスではすべて問題ありませんが、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()

ggplot2で透明な背景を取得する方法はありますか?

112

theme()関数、ggsave()、および凡例の背景のコードで更新されました。

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
  ) 

最も速い方法は、rectを使用することです。これは、すべての四角形要素がrectから継承するためです。

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

より制御された方法は、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

保存するには(この最後のステップは重要です):

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

plot.backgroundに加えて、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()

何らかの理由で、アップロードされた画像の表示が私のコンピューターとは異なるため、省略しました。しかし、私にとっては、まだ白である箱ひげ図の箱部分を除いて、完全に灰色の背景を持つプロットを取得します。それは、ボックスプロットジオムの塗りつぶしの美学を使用して変更することもできます。

編集

ggplot2はその後更新され、opts()関数は廃止されました。現在、theme()の代わりにopts()を使用し、element_rect()の代わりにtheme_rect()などを使用します。

85
joran

YCRの答えを改善するために:

1)x軸とy軸に黒い線を追加しました。そうでなければ、それらも透明になります。

2)凡例キーに透明なテーマを追加しました。そうしないと、そこに塗りつぶされてしまいますが、あまり美しくありません。

最後に、これらはすべてpdf形式とpng形式でのみ機能することに注意してください。 jpegは透明なグラフを生成できません。

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