How to make graphics with transparent background in R using ggplot2?

前端 未结 3 858
耶瑟儿~
耶瑟儿~ 2020-11-28 18:17

I need to output ggplot2 graphics from R to PNG files with transparent background. Everything is ok with basic R graphics, but no transparency with ggplot2:

         


        
相关标签:
3条回答
  • 2020-11-28 18:51

    Updated with the theme() function, ggsave() and the code for the legend background:

    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
      ) 
    

    Fastest way is using using rect, as all the rectangle elements inherit from rect:

    p <- p +
      theme(
            rect = element_rect(fill = "transparent") # all rectangles
          )
        p
    

    More controlled way is to use options of 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
    

    To save (this last step is important):

    ggsave(p, filename = "tr_tst2.png",  bg = "transparent")
    
    0 讨论(0)
  • 2020-11-28 18:57

    Just to improve YCR's answer:

    1) I added black lines on x and y axis. Otherwise they are made transparent too.

    2) I added a transparent theme to the legend key. Otherwise, you will get a fill there, which won't be very esthetic.

    Finally, note that all those work only with pdf and png formats. jpeg fails to produce transparent graphs.

    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
    )
    
    0 讨论(0)
  • 2020-11-28 18:59

    There is also a plot.background option in addition to 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()
    

    For some reason, the uploaded image is displaying differently than on my computer, so I've omitted it. But for me, I get a plot with an entirely gray background except for the box part of the boxplot which is still white. That can be changed using the fill aesthetic in the boxplot geom as well, I believe.

    Edit

    ggplot2 has since been updated and the opts() function has been deprecated. Currently, you would use theme() instead of opts() and element_rect() instead of theme_rect(), etc.

    0 讨论(0)
提交回复
热议问题