วิธีสร้างกราฟิกด้วยพื้นหลังโปร่งใสใน 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) ว่ายอมรับเนื่องจาก "ตัวเลือก" ล้าสมัย
Davit Sargsyan

คำตอบ:


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 geom เช่นกัน

แก้ไข

ggplot2ได้รับการอัปเดตและopts()เลิกใช้งานฟังก์ชันนี้แล้ว ปัจจุบันคุณจะใช้theme()แทนopts()และelement_rect()แทนtheme_rect()ฯลฯ


ฉันไม่ได้คาดหวังว่ามันจะทำงานกับ Mac เมื่อทดสอบกับ PowerPoint ปัจจุบันของแพลตฟอร์มนั้น แต่ทำงานได้ตามที่โฆษณาไว้ และใช้งานได้กับ pdf เช่นกันหากคุณลบหน่วยและเปลี่ยนขนาดเป็นนิ้ว Good job.
IRTFM

1
ซึ่งใช้งานได้ดีกับ MS Powerpoint 2010 อันที่จริงฉันต้องการมันเพื่อจุดประสงค์นี้
Yuriy Petrovskiy

13
หากคุณใช้ ggsave อย่าลืมเพิ่มbg = "transparent"เพื่อส่งผ่านไปยังอุปกรณ์กราฟิก png
ทอม

12
หากคุณใช้knitrแพ็คเกจ (หรือslidifyอื่น ๆ ) คุณต้องส่งผ่านdev.args = list(bg = 'transparent')เป็นตัวเลือกก้อน ดูรายละเอียดเพิ่มเติมที่นี่stackoverflow.com/a/13826154/561698
Andrew

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
)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.