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


123

ggplot2グラフィックスをRから透明な背景の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で背景を透明にする方法はありますか?


3
この回答も参照してください。現在の解決策は追加することですtheme(panel.background = element_rect(fill = "transparent", colour = NA), plot.background = element_rect(fill = "transparent", colour = NA))
Paul Rougieux

「opts」が廃止されたため、2番目の回答(YRCによる)を承認済みとしてマークすることを検討してください。
Davit Sargsyan、

回答:


70

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

1
plot.background上記の答えのように色を設定しないと、プロットの輪郭がぼやけます。
jsta 2018年

87

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

なんらかの理由で、アップロードした画像の表示がコンピューターとは異なるため、省略しました。しかし、私にとっては、まだ白いボックスプロットのボックス部分を除いて、完全に灰色の背景のプロットが得られます。これは、boxplot geomのfill aestheticを使用しても変更できると思います。

編集する

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


そのプラットフォームの現在のPowerPointでテストしたところ、Macで動作するとは思っていませんでしたが、宣伝どおりに動作します。単位を削除してインチでサイズを置き換えれば、PDFでも機能します。
IRTFM、2011

1
これはMS Powerpoint 2010でうまく機能します。実際、私はこの目的のためにそれを正しく必要としていました。
Yuriy Petrovskiy

13
ggsaveを使用している場合はbg = "transparent"、pngグラフィックデバイスに渡すためのアドインを忘れないでください。
トム

12
knitrパッケージ(またはslidifyその他)を使用している場合はdev.args = list(bg = 'transparent')、チャンクオプションとして渡す必要があります。詳細はこちら。stackoverflow.com/ a / 13826154/561698
Andrew

3

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
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.