আমি কীভাবে জিপিপ্লট 2 অবজেক্টের জন্য প্লট অক্ষের রেঞ্জগুলি বের করতে পারি?


90

আমার কাছ থেকে একটি অবজেক্ট রয়েছে ggplot2, বলুন myPlot, আমি কীভাবে এক্স এবং y অক্ষের ব্যাপ্তি সনাক্ত করতে পারি?

এটি ডেটা মানগুলির পরিসীমাটির সাধারণ একাধিক বলে মনে হয় না, কারণ কেউ প্লট পুনরুদ্ধার করতে পারে, অক্ষগুলি পরিমার্জন করতে পারে ইত্যাদি। findFn(থেকে sos) এবং গুগল অক্ষগুলির ব্যাপ্তি কীভাবে সেট করবেন তা বাদে প্রাসঙ্গিক ফলাফলগুলি দেখায় বলে মনে হয় না।


4
আমি মোটামুটি নিশ্চিত যে প্লট অবজেক্ট থেকে নিজেই সরাসরি উত্তোলন করা যায় না, তবে আপনি নিজের ডেটা এবং এর জন্য ডিফল্ট মানগুলি থেকে এটি (সাধারণ ক্ষেত্রে) নির্ণয় করতে পারেন expandএখানে দেখুন ।
জোরান

4
আমি কার্যকারিতা expandযুক্তি উল্লেখ ছিল । উদাহরণস্বরূপ, এখানে তালিকাভুক্ত ডিফল্টগুলি দেখুন । scale_*ggplot
জোর করুন

6
আপনি এটি পরবর্তী সংস্করণে উত্তোলন করতে সক্ষম হবেন ...
হ্যাডলি

4
পরিবর্তে আপনি কি দয়া করে অ্যালেক্স হলকবের উত্তরটি গ্রহণ করতে পারবেন? পল হিমস্ট্র্রা কেবল তিন বছর আগে গিগপ্লট 2 সংস্করণগুলির জন্য প্রাসঙ্গিক।
ম্যাক্স ঘেনিস

4
** আগস্ট 2018 পর্যন্ত আপনি নিম্নলিখিত এবং x এবং y- অক্ষগুলি সীমাবদ্ধ করবেন। ** ggplot_build(obj)$layout$panel_scales_x[[1]]$range$range ggplot_build(obj)$layout$panel_scales_y[[1]]$range$range
মাইকেল 20

উত্তর:


41

Ggplot2 এর নতুন সংস্করণগুলিতে আপনি এই তথ্যটি খুঁজে পেতে পারেন যে আপনার জিজিপ্লাট অবজেক্টটি ggplot_build(p)কোথায় p

Ggplot (<0.8.9) এর পুরানো সংস্করণগুলির জন্য, নিম্নলিখিত সমাধানগুলি কাজ করে:

এবং হ্যাডলি নতুন সংস্করণ প্রকাশ না করা পর্যন্ত এটি সহায়ক হতে পারে। আপনি যদি প্লটে সীমা নির্ধারণ না করেন তবে জিজিপ্লাট অবজেক্টে কোনও তথ্য থাকবে না। তবে সেই ক্ষেত্রে আপনি 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

19
জন্য 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

4
মূল প্লট কলের মধ্যে এটিকে গতিশীল করার কোনও উপায় নেই?
জাজাদ্রা

4
২.২.১-এ আপনি লেয়ার_সকেলে (ggobj) $ y $ রেঞ্জ $ রেঞ্জও ব্যবহার করতে পারেন
অ্যালেক্স হলকম্ব

41

আমি 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

4
এবং সংস্করণ 3.1.0
r_alanb

4
নোট করুন এটি আপনাকে পরিকল্পনার জন্য উপাত্তের ব্যাপ্তি দেয় - পূর্ণ অক্ষের পরিসর পেতে আপনাকে স্কেল প্রসারিত করার অনুমতি দিতে হবে। তদুপরি, সীমা নির্ধারণ করা থাকলে (উদাহরণস্বরূপ ylimবা মাধ্যমে coord_cartesian) স্কেল বিস্তৃতি এখানে দেওয়া কোড দ্বারা ফিরিয়ে দেওয়া পরিবর্তে এই সীমাগুলিতে প্রয়োগ করা হবে।
হিদার টার্নার

22

নভেম্বর 2018 আপডেট

ggplot2 সংস্করণ ৩.১.০ হিসাবে, নিম্নলিখিতগুলি কাজ করে:

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)

পরবর্তী আপডেট হওয়া পর্যন্ত ...


4
কোনও সুবিধামূলক ফাংশন সহ একটি সম্পাদনার পরামর্শ দেওয়া হয়েছে, যদি না পছন্দ করেন তবে রোল-ব্যাক করুন। ;-)
প্যাট্রিকটি

4
@ পেট্রিকটি আপনার আপডেটটি সত্যিই সুবিধাজনক। আমি সত্যিই এটির প্রশংসা করি :)
GegznaV

20

সঙ্গে ইয়ারঞ্জ পান

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

এবং সাথে xrange

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

4
এই সমাধানগুলি অবিচ্ছিন্ন সংখ্যাযুক্ত অক্ষগুলির জন্য ভাল কাজ করে তবে কীভাবে কেউ তারিখগুলি (অবিচ্ছিন্ন স্কেল) বা শ্রেণিবদ্ধ মান সহ অক্ষগুলি পরিচালনা করতে পারে? আমি যখন এই পদ্ধতিটি ব্যবহার করি তখন আমি জুম_টেক্সট ব্যবহার করে পাঠ্য সংযোজন করার জন্য বৃহত সংখ্যাসূচক মানগুলি পাই যা তারিখ বিন্যাসে কিছু রূপান্তর প্রয়োজন।
জোসেফ ক্রেকে

আমি যদি অক্ষ সীমাটি সেট না করে থাকি তবে জিপিপ্লট যা ডিফল্টরূপে পরামর্শ দেয় তা ব্যবহার করে? আমার ব্যবহারের ক্ষেত্রেটি হ'ল আমি প্লট 1 এর জন্য ডিফল্ট মানগুলি পছন্দ করি তবে আমি প্লট 2 এর প্লট 1 এর মতো অক্ষ অক্ষ সীমাবদ্ধ করতে চাই
নিউনামস্ট্যাট

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 পর্যন্ত আপনি নিম্নলিখিত এবং এক্স এবং y- অক্ষগুলি সরিয়ে ফেলছেন।

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


3

এখানে উল্লিখিত হিসাবে: 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")
ফ্রেডেরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.