如何使用ggplot2在R中制作具有透明背景的图形?


123

我需要将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获得透明背景吗?


3
另见这个答案,目前的解决方案是增加theme(panel.background = element_rect(fill = "transparent", colour = NA), plot.background = element_rect(fill = "transparent", colour = NA))
保罗Rougieux

由于“选择”已过时,请考虑将第二个答案(由YRC标记为已接受)。
Davit Sargsyan

Answers:


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
  ) 

最快的方法是使用using 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

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

由于某种原因,上载的图像与计算机上显示的图像有所不同,因此我将其省略。但是对我来说,除了箱形图的框形部分仍然是白色之外,我得到的背景图完全是灰色的。我相信,这也可以使用箱线图几何中的填充美学来更改。

编辑

此后已更新ggplot2opts()不建议使用该功能。当前,您将使用theme()代替opts()element_rect()代替theme_rect(),等等。


在使用该平台的当前PowerPoint测试时,我并不期望它可以与Mac一起使用,但它可以像宣传的那样工作。如果您删除单位和以英寸为单位的替代尺寸,它也适用于pdf。
IRTFM 2011年

1
这在MS Powerpoint 2010上非常有效。实际上,我为此需要它。
尤里·彼得罗夫斯基

13
如果您使用的是ggsave,请不要忘记添加bg = "transparent"以传递到png图形设备。
汤姆(Tom)

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
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.