我需要将具有透明背景的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获得透明背景?
答案 0 :(得分:84)
除了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中的填充美学来改变。
修改强>
此后, ggplot2 已更新,并且已弃用opts()
函数。目前,您可以使用theme()
代替opts()
和element_rect()
代替theme_rect()
等。
答案 1 :(得分:46)
更新了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")
答案 2 :(得分:2)
只是为了改善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
)
答案 3 :(得分:0)
对于像学术编辑那样不喜欢灰色背景的人,试试这个:
p <- p + theme_bw()
p
答案 4 :(得分:0)
Cairo 包可用于将 ggplots 保存为具有透明背景的图像。 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()