Ggplot2 से ग्रिड, पृष्ठभूमि का रंग और शीर्ष और दाईं सीमाएँ निकालें


104

मैं 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

जवाबों:


134

EDIT ने इस उत्तर को अनदेखा कर दिया। अब बेहतर जवाब हैं। टिप्पणियों को देखें। उपयोग+ 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()) 

यहां छवि विवरण दर्ज करें

मूल पोस्ट यह करीब हो जाता है। axis.lineवाई-अक्ष पर काम नहीं करने के साथ एक बग था ( यहां देखें ), जो अभी तक तय नहीं हुआ प्रतीत होता है। इसलिए, पैनल बॉर्डर को हटाने के बाद, वाई-अक्ष को अलग-अलग उपयोग करके खींचना पड़ता है 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

चरम बिंदुओं को काट दिया जाता है, लेकिन बपतिस्मा द्वारा कोड का उपयोग करके कतरन को पूर्ववत किया जा सकता है ।

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

यहां छवि विवरण दर्ज करें

या 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)

आपके अच्छे स्पष्टीकरण के लिए धन्यवाद। Upvoted!
मोहम्मद रहौमा

76

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

यहां वर्तमान ggplot सिंटैक्स को दर्शाते हुए अपडेट किया गया कोड है:

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

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

प्लॉट आउटपुट


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

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

25

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

उदाहरण:

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इस कोड द्वारा बनाई गई फ़ाइल इस प्रकार दिखती है: यहां छवि विवरण दर्ज करें

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


8

मैंने एंड्रयू के उत्तर का पालन ​​किया , लेकिन मुझे भी https://stackoverflow.com/a/35833548 का अनुसरण करना पड़ा और अपने ggplot (v2.1.0) संस्करण में बग के कारण x और y कुल्हाड़ियों को अलग से सेट करना पड़ा ।

के बजाय

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

3

उपरोक्त विकल्पों के साथ बनाए गए मानचित्रों के लिए काम नहीं करते हैं sfऔर geom_sf()। इसलिए, मैं ndiscrयहां संबंधित पैरामीटर जोड़ना चाहता हूं । यह केवल सुविधाओं को दिखाते हुए एक अच्छा साफ नक्शा बनाएगा।

library(sf)
library(ggplot2)

ggplot() + 
  geom_sf(data = some_shp) + 
  theme_minimal() +                     # white background
  theme(axis.text = element_blank(),    # remove geographic coordinates
        axis.ticks = element_blank()) + # remove ticks
  coord_sf(ndiscr = 0)                  # remove grid in the background

1

उपर्युक्त एंड्रयू के उत्तर से सरलीकरण इस प्रमुख विषय को आधी सीमा उत्पन्न करने की ओर ले जाता है।

theme (panel.border = element_blank(),
       axis.line    = element_line(color='black'))

0

यहाँ एक बहुत ही सरल उत्तर है

yourPlot +
  theme(
    panel.border = element_blank(), 
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(), 
    axis.line = element_line(colour = "black")
    )

इट्स दैट ईजी। स्रोत: इस लेख का अंत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.