मैं एक ggplot2 ऑब्जेक्ट के लिए प्लॉट कुल्हाड़ियों की पर्वतमाला कैसे निकाल सकता हूं?


88

मेरे पास एक ऑब्जेक्ट है ggplot2, कहते हैं myPlot, मैं एक्स और वाई एक्सिस के लिए श्रेणियों की पहचान कैसे कर सकता हूं?

यह डेटा मानों की श्रेणी का एक साधारण गुणक प्रतीत नहीं होता है, क्योंकि व्यक्ति भूखंडों को पुनर्विक्रय कर सकता है, अक्षों की श्रेणियों को संशोधित कर सकता है, और इसी तरह। findFn(से sos) और Google को कुल्हाड़ियों की सीमा निर्धारित करने के अलावा अन्य प्रासंगिक परिणाम नहीं दिख रहे हैं।


1
मुझे पूरा यकीन है कि प्लॉट ऑब्जेक्ट से सीधे नहीं निकाला जा सकता है, लेकिन आप इसे (साधारण मामलों में) अपने डेटा और इसके लिए डिफ़ॉल्ट रूप से अनुमान लगा सकते हैं expand। देखें यहाँ
जोरण

1
मैं कार्यों में expandतर्क का उल्लेख कर रहा था । उदाहरण के लिए, यहां सूचीबद्ध चूक देखें । scale_*ggplot
जोरान

6
आप इसे अगले संस्करण में निकालने में सक्षम होंगे ...
हैडली

1
क्या आप इसके बजाय एलेक्स होलकोम्ब के उत्तर को स्वीकार कर सकते हैं? पॉल हीमस्ट्रा तीन साल पहले से ही ggplot2 के संस्करणों के लिए प्रासंगिक है।
मैक्स गनीस

4
** अगस्त 2018 तक आप एक्स और वाई-एक्सिस श्रेणियों को निम्नलिखित के साथ निकालते हैं। ** ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
माइकल

जवाबों:


41

Ggplot2 के नए संस्करणों में, आप इस जानकारी को आउटपुट के बीच पा सकते हैं ggplot_build(p), जहाँ pआपका ggplot ऑब्जेक्ट है।

Ggplot (<0.8.9) के पुराने संस्करणों के लिए, निम्नलिखित समाधान काम करता है:

और जब तक हैडली नया संस्करण जारी नहीं करता, तब तक यह मददगार हो सकता है। यदि आप भूखंड में सीमा निर्धारित नहीं करते हैं, तो ggplot ऑब्जेक्ट में कोई जानकारी नहीं होगी। हालाँकि, उस स्थिति में आप ggplot2 की चूक का उपयोग कर सकते हैं और डेटा से xlim और ylim प्राप्त कर सकते हैं।

> ggobj = ggplot(aes(x = speed, y = dist), data = cars) + geom_line()
> ggobj$coordinates$limits

$x
NULL

$y
NULL

एक बार सीमा तय करने के बाद, वे वस्तु में उपलब्ध हो जाते हैं:

> bla = ggobj + coord_cartesian(xlim = c(5,10))
> bla$coordinates$limits
$x
[1]  5 10

$y
NULL

34
विशेष रूप से, ggplot2 के नए संस्करणों में, आप ggplot_build (ggobj) $ पैनल $ पर्वतमाला [[1]] $ y.range के साथ व्यवस्था प्राप्त कर सकते हैं और ggplot_build (ggobj) $ पैनल $ पर्वतमाला [[1]] $ के साथ व्यवस्थित करें x.range
एलेक्स होल्कोम्बे

11
के लिए ggplot2संस्करण 2.1.0.9001 इस का उपयोग R: कोड ggplot_build(obj)$layout$panel_ranges[[1]]$x.range ggplot_build(obj)$layout$panel_ranges[[1]]$y.range
GegznaV

17
के लिए ggplot2 संस्करण 2.2.1.9000 और इस (संभवत:) नए प्रयोग Rकोड: ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
GegznaV

3
क्या मूल प्लॉट कॉल के भीतर इसे गतिशील रूप से करने का कोई तरीका नहीं है?
जजदरा

4
2.2.1 में आप layer_scales (ggobj) $ y $ रेंज $ रेंज का उपयोग भी कर सकते हैं
एलेक्स होलकोम्बे

40

मैं ggplot2संस्करण 2 का उपयोग कर रहा हूं, मुझे यकीन नहीं है कि यह पिछले संस्करण है, मान लीजिए कि आपने pltऑब्जेक्ट पर अपना प्लॉट बचाया है । पर्वतमाला निकालना आसान है,

# y-range
layer_scales(plt)$y$range$range

# x-range
layer_scales(plt)$x$range$range

पहलू साजिश के मामले में, आप का उपयोग कर व्यक्तिगत पहलुओं के तराजू का उपयोग कर सकते हैं layer_scales(plot, row_idx, col_idx)। उदाहरण के लिए पहली पंक्ति और दूसरे कॉलम में पहलू तक पहुँचने के लिए,

# y-range
layer_scales(plt, 1, 2)$y$range$range

# x-range
layer_scales(plt, 1, 2)$x$range$range

2
और संस्करण 3.1.0
r_alanb

2
ध्यान दें कि यह आपको प्लॉट किए जाने वाले डेटा की श्रेणी देता है - पूर्ण अक्ष सीमा प्राप्त करने के लिए आपको स्केल विस्तार के लिए अनुमति देने की आवश्यकता होगी। इसके अलावा, अगर सीमाएं निर्धारित की गई हैं (जैसे कि के माध्यम से ylimया coord_cartesian) तो पैमाने पर विस्तार यहां दिए गए कोड द्वारा वापस लौटने के बजाय इन सीमाओं पर लागू होगा।
हीथ टर्नर

22

नवंबर 2018 अद्यतन

के रूप में ggplot2 संस्करण 3.1.0 , निम्नलिखित काम करता है:

obj <- qplot(mtcars$disp, bins = 5)

# x range
ggplot_build(obj)$layout$panel_params[[1]]$x.range

# y range
ggplot_build(obj)$layout$panel_params[[1]]$y.range

एक सुविधा समारोह:

get_plot_limits <- function(plot) {
    gb = ggplot_build(plot)
    xmin = gb$layout$panel_params[[1]]$x.range[1]
    xmax = gb$layout$panel_params[[1]]$x.range[2]
    ymin = gb$layout$panel_params[[1]]$y.range[1]
    ymax = gb$layout$panel_params[[1]]$y.range[2]
    list(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax)
}
get_plot_limits(p)

अगले अपडेट तक ...


1
यदि आप इसे पसंद नहीं करते हैं, तो एक सुविधा फ़ंक्शन के साथ एक संपादन का सुझाव दें, रोल-बैक करें। ;-)
पैट्रिक टीटी

1
@PatrickT आपका अपडेट वास्तव में सुविधाजनक है। मैं वास्तव में इसकी सराहना करता हूं :)
GegznaV

20

के साथ व्यवस्था करें

ggplot_build(myPlot)$panel$ranges[[1]]$y.range 

और xrange के साथ

ggplot_build(myPlot)$panel$ranges[[1]]$x.range

2
ये समाधान निरंतर संख्यात्मक कुल्हाड़ियों के लिए अच्छी तरह से काम करते हैं, लेकिन कोई दिनांक (निरंतर पैमाने) या श्रेणीबद्ध मूल्यों के साथ कुल्हाड़ियों को कैसे संभाल सकता है? जब मैं इस पद्धति का उपयोग करता हूं तो मुझे बड़े संख्यात्मक मान मिलते हैं, जिसमें जियोम_टेक्स्ट का उपयोग करके पाठ को जोड़ने के लिए कुछ प्रारूप की आवश्यकता होती है।
जोसेफ क्रेके

क्या होगा यदि मैं अक्ष सीमा निर्धारित नहीं कर रहा हूं, लेकिन डिफ़ॉल्ट रूप से ggplot का उपयोग करना क्या है? मेरा उपयोग मामला यह है कि मुझे प्लॉट 1 के लिए डिफ़ॉल्ट मान पसंद हैं, लेकिन मैं प्लॉट 2 को प्लॉट 1 के समान अक्ष सीमा की तरह चाहता हूं।
NewNameStat

16

में संस्करण 2.2.0 इस इस प्रकार किया जा सकता है:

# y-range
ggplot_build(plot.object)$layout$panel_ranges[[1]]$y.range
# x-range
ggplot_build(plot.object)$layout$panel_ranges[[1]]$x.range

8

अगस्त 2018 तक आप एक्स और वाई-एक्सिस पर्वतमाला को निम्न के साथ निकालते हैं।

ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range


2

जैसा कि यहां बताया गया है: https://gist.github.com/tomhopper/9076152#gistcomment-2624958 दो विकल्पों में अंतर है:

#get ranges of the data
ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range 
ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range

#get ranges of the plot axis
ggplot_build(obj)$layout$panel_params[[1]]$x.range
ggplot_build(obj)$layout$panel_params[[1]]$y.range

यहां भूखंडों की सूची लेने, सामान्य y- अक्ष सीमा निकालने और इसे बदलने के लिए सुविधा कार्यों का एक सेट है। मुझे इसकी आवश्यकता थी क्योंकि मैंने एक ग्राफ़ के माध्यम से अलग-अलग डेटा सेटों का उपयोग किया ggarange:

require(ggplot2)
#get the visible scales from single plots
get_plot_view_ylimits <- function(plot) {
  gb = ggplot_build(plot)
  ymin = gb$layout$panel_params[[1]]$y.range[1]
  ymax = gb$layout$panel_params[[1]]$y.range[2]
  message(paste("limits are:",ymin,ymax))
  list(ymin = ymin, ymax = ymax)
}

#change the limit of single plot, using list of limits
change_plot_ylimits <- function(plot, nlimits){
  p <- plot + ggplot2:::limits(unlist(nlimits, use.names =FALSE),"y")
}

#adjust the scales of multiple plots
#take a list of plots, passes back adjusted list of plots
adjust_plots_shared_ylimits <- function(plotList) {
  #read limits
  first <- TRUE
  for (plot in plotList) {
    if (first) {
      nlimits <- get_plot_view_ylimits(plot)
      first <- FALSE
    } else {
      altLimits <- get_plot_view_ylimits(plot)
      nlimits$ymin <- min(nlimits$ymin,altLimits$ymin)
      nlimits$ymax <- max(nlimits$ymax,altLimits$ymax)
    }
  }
  message(paste("new limits are:",nlimits$ymin,nlimits$ymax))
  #adjust limits
  lapply(plotList,change_plot_ylimits,nlimits)
}

मैंने सोचा कि यह दूसरों के लिए भी उपयोगी हो सकता है।


एक समस्या है, शायद किसी को पता है कि कैसे निपटना है: रिपोर्ट की गई सीमाएं "सभी श्रेणियों में भूखंडों से शामिल करने के लिए पर्याप्त" हैं, लेकिन वे वास्तविक अधिकतम की तुलना में बहुत अधिक हैं (जैसे, एक सूची में कहते हैं) भूखंडों का उपयोग करनाstat_smooth( method = "lm")
फ्रेडरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.