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

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

141052 次浏览

除了 panel.background之外,还有一个 plot.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(),等等。

创建初始情节:

library(ggplot2)
d <- rnorm(100)
df <- data.frame(
x = 1,
y = d,
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
)

将上面的绘图修改为具有完全透明背景的最快方法是设置 theme()rect参数,因为所有矩形元素都继承自 rect:

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

p

一种更可控的方法是分别设置 theme()的更具体的参数:

p <- p + theme(
panel.background = element_rect(fill = "transparent",
colour = NA_character_), # necessary to avoid drawing panel outline
panel.grid.major = element_blank(), # get rid of major grid
panel.grid.minor = element_blank(), # get rid of minor grid
plot.background = element_rect(fill = "transparent",
colour = NA_character_), # necessary to avoid drawing plot outline
legend.background = element_rect(fill = "transparent"),
legend.box.background = element_rect(fill = "transparent"),
legend.key = element_rect(fill = "transparent")
)


p

ggsave() 提供了一个专用的参数 bg来设置

背景颜色。如果是 NULL,则使用来自情节主题的 plot.background填充值。

使用透明背景将 ggplot 对象 p写入磁盘上的 filename:

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

只是为了改进 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
)

如果有人不喜欢像学术编辑这样的灰色背景,试试这个:

p <- p + theme_bw()
p

Cairo 包可以用来将 ggplot 保存为具有透明背景的图像。 Https://cran.r-project.org/web/packages/cairo/cairo.pdf

CaiorPNG(filename = "TEST.png", bg = "transparent")


ggplot(mtcars, aes(wt, mpg))+
geom_point()+
theme(panel.background = element_rect(fill = "transparent"),
plot.background = element_rect(fill = "transparent", colour = NA))


dev.off()

我相信这将为那些谁是工作在 R 降价,不想使用 ggsave保存一个单独的文件。

执行以下操作,然后添加这个块选项: {r, dev.args = list(bg = 'transparent')}:

ggplot(mtcars, aes(wt, mpg)) +
geom_point() +
theme(
# makes background transparent:
plot.background = element_rect(fill = "transparent",colour = NA),
# gets rid of white border around plot:
panel.border = element_blank()
)

例如,我在 R Markdown 中使用了 ioslides 表示,但是请注意,我还没有在这个上下文之外测试过它。