Как сделать графику с прозрачным фоном в R с помощью ggplot2?

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
Пожалуйста, подумайте о том, чтобы пометить второй ответ (YRC) как принятый, поскольку «opts» устарел.
Давид Саргсян

Ответы:

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")
YCR
источник
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()

По какой-то причине загруженное изображение отображается иначе, чем на моем компьютере, поэтому я его пропустил. Но для меня я получаю график с полностью серым фоном, за исключением прямоугольной части коробчатой ​​диаграммы, которая все еще остается белой. Я полагаю, что это можно изменить, используя эстетику заливки в геометрии блочной диаграммы.

редактировать

С тех пор ggplot2 был обновлен, и opts()функция устарела. В настоящее время вы бы использовали theme()вместо opts()и element_rect()вместо theme_rect()и т. Д.

Joran
источник
Я не ожидал, что он будет работать с Mac при тестировании с текущим PowerPoint этой платформы, но он работает так, как рекламируется. И он также работает с PDF-файлами, если вы удалите единицы и замените размеры в дюймах. Хорошая работа.
IRTFM
1
Это отлично работает с MS Powerpoint 2010. На самом деле мне это было нужно именно для этой цели.
Юрий Петровский
13
Если вы используете ggsave, не забудьте добавить его bg = "transparent"для передачи графическому устройству png.
Том
12
если вы используете knitrпакет (или slidifyт. д.), вам нужно передать его dev.args = list(bg = 'transparent')как параметр чанка. Подробнее здесь stackoverflow.com/a/13826154/561698
Эндрю
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
)
Rtist
источник