Ggplot2 का उपयोग करके R में पारदर्शी पृष्ठभूमि वाले ग्राफिक्स कैसे बनाएं?


123

मुझे पारदर्शी पृष्ठभूमि के साथ R से PNG फ़ाइलों तक ggplot2 ग्राफिक्स का उत्पादन करने की आवश्यकता है। बुनियादी आर ग्राफिक्स के साथ सब कुछ ठीक है, लेकिन 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 द्वारा) अंकित करने के बारे में विचार करें क्योंकि '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, जैसा कि सभी आयत तत्वों को प्राप्त होता है:

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

किसी कारण से, अपलोड की गई छवि मेरे कंप्यूटर पर अलग-अलग प्रदर्शित हो रही है, इसलिए मैंने इसे छोड़ दिया है। लेकिन मेरे लिए, मुझे बॉक्सप्लेट के बॉक्स भाग को छोड़कर पूरी तरह से ग्रे पृष्ठभूमि के साथ एक प्लॉट मिलता है जो अभी भी सफेद है। मुझे लगता है कि बॉक्सप्लॉट जूम में भरण सौंदर्य का उपयोग करके इसे बदला जा सकता है।

संपादित करें

ggplot2 को अपडेट opts()किया गया है और फ़ंक्शन को हटा दिया गया है। वर्तमान में, आप के theme()बजाय opts()और के element_rect()बजाय का उपयोग करेंगे theme_rect(), आदि।


मैं उम्मीद नहीं कर रहा था कि मैक के साथ काम करने के लिए जब उस प्लेटफ़ॉर्म के वर्तमान PowerPoint के साथ परीक्षण किया जाए, लेकिन यह विज्ञापित के रूप में काम करता है। और यह पीडीएफ़ के साथ काम करता है यदि आप इकाइयों को हटाते हैं और इंच में अच्छा विकल्प देते हैं।
IRTFM

1
यह एमएस पॉवरपॉइंट 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) मैंने लीजेंड की के लिए एक पारदर्शी विषय जोड़ा। अन्यथा, आपको वहां एक भरण मिलेगा, जो बहुत अधिक नहीं होगा।

अंत में, ध्यान दें कि वे सभी केवल पीडीएफ और पीएनजी प्रारूपों के साथ काम करते हैं। 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.