Làm thế nào để tạo đồ họa với nền trong suốt trong R bằng ggplot2?


123

Tôi cần xuất đồ họa ggplot2 từ tệp R sang PNG với nền trong suốt. Mọi thứ đều ổn với đồ họa R cơ bản, nhưng không rõ ràng với 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()

Có cách nào để có được nền trong suốt với ggplot2 không?


3
Xem thêm câu trả lời này , giải pháp hiện tại là thêmtheme(panel.background = element_rect(fill = "transparent", colour = NA), plot.background = element_rect(fill = "transparent", colour = NA))
Paul Rougieux 15/02/17

Vui lòng xem xét đánh dấu câu trả lời thứ hai (bằng YRC) là được chấp nhận do 'lựa chọn' đã lỗi thời.
Davit Sargsyan

Câu trả lời:


70

Đã cập nhật theme()hàm ggsave()và mã cho nền chú giải:

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
  ) 

Cách nhanh nhất là sử dụng bằng cách sử dụng rect, vì tất cả các phần tử hình chữ nhật kế thừa từ trực tràng:

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

Cách kiểm soát nhiều hơn là sử dụng các tùy chọn của 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

Để lưu (bước cuối cùng này rất quan trọng):

ggsave(p, filename = "tr_tst2.png",  bg = "transparent")

1
Nếu bạn không đặt plot.backgroundmàu như câu trả lời ở trên, âm mưu của bạn sẽ có một đường viền mờ nhạt.
jsta

87

Ngoài ra còn có một plot.backgroundtùy chọn ngoài 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()

Vì một số lý do, hình ảnh đã tải lên hiển thị khác với trên máy tính của tôi, vì vậy tôi đã bỏ qua nó. Nhưng đối với tôi, tôi nhận được một cốt truyện có nền hoàn toàn là màu xám, ngoại trừ phần hộp của hộp vẫn là màu trắng. Tôi tin rằng điều đó cũng có thể được thay đổi bằng cách sử dụng thẩm mỹ lấp đầy trong boxplot geom.

Biên tập

ggplot2 kể từ đó đã được cập nhật và opts()chức năng này không được dùng nữa. Hiện tại, bạn sẽ sử dụng theme()thay vì opts()element_rect()thay vì theme_rect(), v.v.


Tôi đã không mong đợi nó hoạt động với máy Mac khi được thử nghiệm với PowerPoint hiện tại của nền tảng đó nhưng nó hoạt động như được quảng cáo. Và nó cũng hoạt động với pdf nếu bạn loại bỏ các đơn vị và kích thước thay thế bằng inch Làm tốt lắm.
IRTFM

1
Điều này hoạt động tuyệt vời với MS Powerpoint 2010. Trên thực tế, tôi cần nó đúng cho mục đích này.
Yuriy Petrovskiy

13
Nếu bạn đang sử dụng ggsave, đừng quên thêm vào bg = "transparent"để chuyển sang thiết bị đồ họa png.
Tom

12
nếu bạn đang sử dụng knitrgói (hoặc slidifyv.v.), bạn cần chuyển dev.args = list(bg = 'transparent')dưới dạng tùy chọn phân đoạn. Thông tin chi tiết tại đây stackoverflow.com/a/13826154/561698
Andrew

3

Chỉ để cải thiện câu trả lời của YCR:

1) Tôi đã thêm các đường màu đen trên trục x và y. Nếu không, chúng cũng được làm trong suốt.

2) Tôi đã thêm một chủ đề trong suốt vào phím chú giải. Nếu không, bạn sẽ bị trám ở đó, trông sẽ không thẩm mỹ lắm.

Cuối cùng, lưu ý rằng tất cả những thứ đó chỉ hoạt động với định dạng pdf và png. jpeg không tạo được đồ thị minh bạch.

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
)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.