2012-06-02 11 views
68

से ग्रिड, पृष्ठभूमि रंग, और शीर्ष और दाएं सीमाओं को निकालें I ggplot2 का उपयोग करके तुरंत नीचे साजिश को पुन: पेश करना चाहते हैं। मैं करीब आ सकता हूं, लेकिन शीर्ष और दाएं सीमाओं को हटा नहीं सकता। नीचे मैं ggplot2 का उपयोग करके कई प्रयास प्रस्तुत करता हूं, जिसमें स्टैक ओवरफ्लो पर या उसके माध्यम से कई सुझाव शामिल हैं। दुर्भाग्य से मैं उन सुझावों को काम करने में सक्षम नहीं हूं।ggplot2

मुझे उम्मीद है कि कोई नीचे दिए गए कोड स्निपेट को एक या अधिक सही करने में सक्षम हो सकता है।

किसी भी सुझाव के लिए धन्यवाद।

# desired plot 
a <- seq(1,20) 
b <- a^0.25 
plot(a,b, bty = "l") 


library(ggplot2) 

df <- as.data.frame(cbind(a,b)) 

# 1. ggplot2 default 
ggplot(df, aes(x = a, y = b)) + geom_point() 

# 2. removes background color 
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) 

# 3. also removes gridlines 
none <- theme_blank() 
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) 

# 4. does not remove top and right border 
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.border = none) 

# 5. does not remove top and right border 
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(axis.line = theme_segment()) 

# 6. removes x and y axis in addition to top and right border 
# http://stackoverflow.com/questions/5458409/remove-top-and-right-border-from-ggplot2 
ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.background=theme_rect(colour=NA)) 

# 7. returns error when attempting to remove top and right border 
# https://groups.google.com/group/ggplot2/browse_thread/thread/f998d113638bf251 
# 
# Error in el(...) : could not find function "polylineGrob" 
# 
theme_L_border <- function(colour = "black", size = 1, linetype = 1) { 
    structure( 
    function(x = 0, y = 0, width = 1, height = 1, ...) { 
     polylineGrob( 
     x=c(x+width, x, x), y=c(y,y,y+height), ..., default.units = "npc", 
     gp=gpar(lwd=size, col=colour, lty=linetype), 
     ) 
    }, 
    class = "theme", 
    type = "box", 
    call = match.call() 
    ) 
} 

ggplot(df, aes(x = a, y = b)) + geom_point() + opts(panel.background = theme_rect(fill='white', colour='black')) + opts(panel.grid.major = none, panel.grid.minor = none) + opts(panel.border = theme_L_border()) 
+3

इस्तेमाल किया नीचे एक टिप्पणी में तैनात के रूप में, यह अब साथ किया जा सकता + theme_classic() – nsheff

उत्तर

88

संपादित इस जवाब पर ध्यान न दें। अब बेहतर जवाब हैं। टिप्पणियां देखें। का प्रयोग करें + theme_classic()

संपादित

यह एक बेहतर संस्करण है। मूल पोस्ट में नीचे उल्लिखित बग बनी हुई है (मुझे लगता है)। लेकिन अक्ष रेखा को पैनल के नीचे खींचा जाता है। इसलिए अक्ष अक्षरों को देखने के लिए panel.border और panel.background दोनों को हटा दें।

library(ggplot2) 
a <- seq(1,20) 
b <- a^0.25 
df <- as.data.frame(cbind(a,b)) 

ggplot(df, aes(x = a, y = b)) + geom_point() + 
    theme_bw() + 
    theme(axis.line = element_line(colour = "black"), 
    panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), 
    panel.border = element_blank(), 
    panel.background = element_blank()) 

enter image description here

मूल पोस्ट यह करीब हो जाता है। axis.line के साथ एक बग था जो वाई-अक्ष (see here) पर काम नहीं कर रहा था, जो अभी तक तय नहीं किया गया है। इसलिए, पैनल सीमा को हटाने के बाद, y-axis को geom_vline का उपयोग करके अलग से खींचा जाना है।

library(ggplot2) 
library(grid) 

a <- seq(1,20) 
b <- a^0.25 
df <- as.data.frame(cbind(a,b)) 

p = ggplot(df, aes(x = a, y = b)) + geom_point() + 
    scale_y_continuous(expand = c(0,0)) + 
    scale_x_continuous(expand = c(0,0)) + 
    theme_bw() + 
    opts(axis.line = theme_segment(colour = "black"), 
     panel.grid.major = theme_blank(), 
     panel.grid.minor = theme_blank(), 
     panel.border = theme_blank()) + 
    geom_vline(xintercept = 0) 
p 

चरम अंक काटा जाता है, लेकिन कतरन baptiste द्वारा कोड का उपयोग कर नष्ट कर दिया जा सकता है।

gt <- ggplot_gtable(ggplot_build(p)) 
gt$layout$clip[gt$layout$name=="panel"] <- "off" 
grid.draw(gt) 

enter image description here

या limits का उपयोग पैनल की सीमाओं को स्थानांतरित करने के।

ggplot(df, aes(x = a, y = b)) + geom_point() + 
    xlim(0,22) + ylim(.95, 2.1) + 
    scale_x_continuous(expand = c(0,0), limits = c(0,22)) + 
    scale_y_continuous(expand = c(0,0), limits = c(.95, 2.2)) + 
    theme_bw() + 
    opts(axis.line = theme_segment(colour = "black"), 
     panel.grid.major = theme_blank(), 
     panel.grid.minor = theme_blank(), 
     panel.border = theme_blank()) + 
    geom_vline(xintercept = 0) 
+3

मुझे लगता है कि मैं शायद करने के लिए जाँच चिह्न देना चाहिए अन्य जवाब अब। आप जवाब 2012 में चेक मार्क के बिल्कुल योग्य थे और बेहद सहायक थे। हालांकि, दूसरा जवाब अब बेहतर लगता है। हालांकि, केवल ऐतिहासिक कारणों के लिए, मुझे चेक अंक स्विच करने से नफरत है। –

+2

अगर यह मैं था, तो मैंने इसे 12 महीने पहले किया होगा। –

71

ggplot (0.9.2+) के हालिया अपडेट विषयों के लिए वाक्यविन्यास को ओवरहाल कर चुके हैं। सबसे विशेष रूप से, opts() अब बहिष्कृत है, जिसे theme() द्वारा प्रतिस्थापित किया गया है। Sandy's उत्तर अभी भी (जनवरी 1212 तक) एक चार्ट उत्पन्न करेगा, लेकिन आर को चेतावनियों का एक गुच्छा फेंकने का कारण बनता है।

library(ggplot2) 
a <- seq(1,20) 
b <- a^0.25 
df <- as.data.frame(cbind(a,b)) 

#base ggplot object 
p <- ggplot(df, aes(x = a, y = b)) 

p + 
    #plots the points 
    geom_point() + 

    #theme with white background 
    theme_bw() + 

    #eliminates background, gridlines, and chart border 
    theme(
    plot.background = element_blank() 
    ,panel.grid.major = element_blank() 
    ,panel.grid.minor = element_blank() 
    ,panel.border = element_blank() 
) + 

    #draws x and y axis line 
    theme(axis.line = element_line(color = 'black')) 

उत्पन्न करता है:

यहाँ वर्तमान ggplot वाक्य रचना को दर्शाती कोड अपडेट हो जाता है

plot output

+29

या अधिक बस? ggplot (df, aes (x = a, y = b)) + geom_point() + theme_classic() – user20650

+0

ggplot2 2.1.0 का उपयोग करके इन दृष्टिकोणों में से कोई भी मेरे लिए काम नहीं करता है ... @ wkretzsch का जवाब अच्छा था। – Nova

17

theme_classic() के लिए एक वैकल्पिक विषय है कि cowplot पैकेज के साथ आता है, theme_cowplot() (साथ स्वचालित रूप से लोड पैकेज)। यह कुछ सूक्ष्म मतभेदों के साथ theme_classic() जैसा दिखता है। सबसे महत्वपूर्ण बात यह है कि डिफ़ॉल्ट लेबल आकार बड़े होते हैं, इसलिए परिणामी आंकड़ों को बिना किसी संशोधन के प्रकाशनों में उपयोग किया जा सकता है (विशेष रूप से यदि आप उन्हें ggsave() के बजाय save_plot() से सहेजते हैं)।साथ ही, पृष्ठभूमि पारदर्शी है, सफेद नहीं, जो उपयोगी हो सकती है यदि आप चित्रकार में आकृति को संपादित करना चाहते हैं। अंत में, मेरी राय में पहलूदार भूखंड बेहतर दिखते हैं।

उदाहरण:

library(cowplot) 
a <- seq(1,20) 
b <- a^0.25 
df <- as.data.frame(cbind(a,b)) 

p <- ggplot(df, aes(x = a, y = b)) + geom_point() 
save_plot('plot.png', p) # alternative to ggsave, with default settings that work well with the theme 

यह वही है फ़ाइल plot.png इस कोड से तैयार लग रहा है की तरह है: enter image description here

अस्वीकरण: मैं पैकेज लेखक हूँ।

7

मैंने Andrew's answer का पालन किया, लेकिन मुझे https://stackoverflow.com/a/35833548 का पालन करना पड़ा और ggplot (v2.1.0) के मेरे संस्करण में एक बग के कारण एक्स और वाई अक्ष को अलग से सेट करना पड़ा।

के बजाय

theme(axis.line = element_line(color = 'black')) 

मैं

theme(axis.line.x = element_line(color="black", size = 2), 
    axis.line.y = element_line(color="black", size = 2)) 
+0

बहुत अच्छा जवाब। मेरे लिए कुछ और काम नहीं किया - मुझे लगता है कि यह बग बेहतर दस्तावेज होना चाहिए। – thiagoveloso