Як зробити графіку з прозорим фоном у 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))
Пол Рудьо

Будь ласка, розглянути можливість позначення другої відповіді (YRC) як прийнятої через те, що 'опц' є застарілим.
Давіт Саргсян

Відповіді:


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, оскільки всі елементи прямокутника успадковують від прямої:

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

З якоїсь причини завантажене зображення відображається інакше, ніж на моєму комп’ютері, тому я його опустив. Але для мене я отримую сюжет з цілком сірим фоном, за винятком коробкової частини коробки, яка все ще біла. Це, можливо, можна змінити, використовуючи естетику заповнення в геометрії Boxplot.

Редагувати

ggplot2 з тих пір оновлюється, а opts()функція застаріла. В даний час ви б використовували theme()замість opts()і element_rect()замість theme_rect()і т.д.


Я не очікував, що він буде працювати з 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
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.