Как сделать графику с прозрачным фоном в R, используя ggplot2?
Мне нужно вывести графику 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?
Ответы
Ответ 1
Обновлен функцией 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
, поскольку все элементы прямоугольника наследуются от прямоугольника:
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
В дополнение к 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()
По какой-то причине загруженное изображение отображается иначе, чем на моем компьютере, поэтому я опустил его. Но для меня я получаю сюжет с совершенно серым фоном, за исключением коробки в коробке, которая все еще белая. Я думаю, что это можно изменить, используя эстетику заливки в геометрии boxplot.
Edit
ggplot2 с тех пор обновлен и функция opts()
устарела. В настоящее время вместо opts()
и element_rect()
вместо theme_rect()
и т.д. Используйте theme()
и т.д.
Ответ 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
)