জিপিপ্লট 2-তে জিওম_পয়েন্টের এনপিসি স্থানাঙ্ক


10

আমি কিভাবে পেতে পারেন এক্স , Y একটি স্থানাঙ্ক geom_point একটি ggplot , যেখানে রেফারেন্স ফ্রেম সমগ্র অঙ্কিত ইমেজ?

আমি কিছু জিওম_পয়েন্ট ব্যবহার করে একটি জিজিপ্লট তৈরি করতে পারি :

library(ggplot2)

my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
             geom_point(aes(x, y), color = "red")

এটি দেয়:

এখানে চিত্র বর্ণনা লিখুন

এটিকে একটি ছাঁকনাতে রূপান্তরিত করে , আমি বেগুনি তীর দ্বারা চিহ্নিত প্লট প্যানেলের সাথে স্থানাঙ্কগুলির মতো এই জিজিপ্লট সম্পর্কে কিছু অতিরিক্ত তথ্য বের করতে পারি । যাইহোক, এটি অক্ষ দ্বারা গৃহীত স্থান উপেক্ষা করে।

my.grob <- ggplotGrob(my.plot)
my.grob$grobs[[6]]$children[[3]]$x
# [1] 0.0454545454545455native 0.46native 0.954545454545454native 
my.grob$grobs[[6]]$children[[3]]$y
# [1] 0.0454545454545455native 0.157272727272727native 0.954545454545454native

সবুজ তীর দ্বারা চিহ্নিত, যখন আমি পুরো চিত্রের নীচে-বাম কোণ থেকে পরিমাপ শুরু করি , তখন আমি কীভাবে এক্স , y স্থানাঙ্কের মান পেতে পারি ?

যদি এটি সম্ভব হয় তবে আমি ggplot এর থিমটি বিবেচনার জন্য সমাধানটি চাই । মত থিম যুক্ত করা + theme_void()অক্ষগুলিকে প্রভাবিত করে এবং পুরো প্লট করা ইমেজের সাথে পয়েন্টের অবস্থান পরিবর্তন করে।

আপডেট : আমি বুঝতে পেরেছি যে প্লটের প্যানেলের আপেক্ষিক আকারকে প্রভাবিত করে প্লটের প্রস্থ এবং উচ্চতার উপর নির্ভর করে অক্ষগুলির ফন্টের আকার পরিবর্তন হয় । সুতরাং প্লটের প্রস্থ এবং প্লটের উচ্চতা নির্ধারণ না করে এনপিসি ইউনিটে অবস্থান সরবরাহ করা তুচ্ছ হবে না । যদি সম্ভব হয় তবে প্লটের প্রস্থ এবং প্লটের উচ্চতার ফাংশন হিসাবে জিওম_পয়েন্টগুলির অবস্থান দিন ।


5
2 ডাউনভোটস কেন?
মার্কস

2
হ্যাঁ, আপনার উদ্বেগ বা পরামর্শ থাকলে মন্তব্য করুন
এলবোগার্ড্ট

1
বিবেচনা করুন যে প্লটটি নিজেই নির্দিষ্ট মাত্রা নেই - পরম পয়েন্ট অবস্থানগুলি কেবল আপনি যে ডিভাইসে প্রিন্ট করেন তা নির্ভর করে না, তবে আপনার অক্ষের অনুপাতের উপরও নির্ভর করে। সুতরাং আপনার কী প্রয়োজন তা বেশ কৌতূহলপূর্ণ
তেজেবো bo

1
ডাউনভোটগুলি সম্পর্কে, দ্রষ্টব্য যে এসই-তে একটি বৈধ প্রশ্ন হওয়ার জন্য আমার প্রশ্নটি ন্যায়সঙ্গত করার দরকার নেই। আমি কেন জানতে চাই? কারণ আমি করি.
এলবোগার্ড

1
এই এক। কিন্তু কখনও একটি বাস্তব উত্তর পেয়েছিলাম stackoverflow.com/questions/48710478/...
Tjebo

উত্তর:


5

আপনি যখন কোনও জিজিপ্লট আকার পরিবর্তন করেন, প্যানেলের মধ্যে উপাদানগুলির অবস্থান এনপিসি স্পেসে স্থির অবস্থানে থাকে না। এর কারণ প্লটের কিছু উপাদান স্থির আকার ধারণ করে এবং এর মধ্যে কয়েকটি (উদাহরণস্বরূপ, প্যানেল) ডিভাইসের আকার অনুযায়ী মাত্রা পরিবর্তন করে।

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

আরেকটি অসুবিধা হ'ল এটি নিশ্চিত করা হচ্ছে যে আপনি প্যানেল গ্রাবের মধ্যে সঠিক ক্রবগুলি সনাক্ত করছেন এবং এটি সহজে কীভাবে সাধারণ করা যায় তা দেখা মুশকিল। তালিকা উপসেট ফাংশন ব্যবহার করে [[6]]এবং [[3]]আপনার উদাহরণে অন্যান্য প্লট করার generalizable নয়।

যাইহোক, এই সমাধানটি gtable এর মধ্যে প্যানেলের আকার এবং অবস্থান পরিমাপ করে এবং মিলিমিটারগুলিতে প্লট মাত্রা দ্বারা ভাগ করে আগে এনপিসি স্পেসে রূপান্তর করার আগে সমস্ত আকারকে মিলিমিটারে রূপান্তর করে। আমি সংখ্যার সূচক না হয়ে প্যানেল এবং নামগুলি দিয়ে নামগুলি বের করে কিছুটা সাধারণ করার চেষ্টা করেছি।

library(ggplot2)
library(grid)
require(gtable)

get_x_y_values <- function(gg_plot)
{
  img_dim      <- grDevices::dev.size("cm") * 10
  gt           <- ggplot2::ggplotGrob(gg_plot)
  to_mm        <- function(x) grid::convertUnit(x, "mm", valueOnly = TRUE)
  n_panel      <- which(gt$layout$name == "panel")
  panel_pos    <- gt$layout[n_panel, ]
  panel_kids   <- gtable::gtable_filter(gt, "panel")$grobs[[1]]$children
  point_grobs  <- panel_kids[[grep("point", names(panel_kids))]]
  from_top     <- sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))
  from_left    <- sum(to_mm(gt$widths[seq(panel_pos$l - 1)]))
  from_right   <- sum(to_mm(gt$widths[-seq(panel_pos$l)]))
  from_bottom  <- sum(to_mm(gt$heights[-seq(panel_pos$t)]))
  panel_height <- img_dim[2] - from_top - from_bottom
  panel_width  <- img_dim[1] - from_left - from_right
  xvals        <- as.numeric(point_grobs$x)
  yvals        <- as.numeric(point_grobs$y)
  yvals        <- yvals * panel_height + from_bottom
  xvals        <- xvals * panel_width + from_left
  data.frame(x = xvals/img_dim[1], y = yvals/img_dim[2])
}

এখন আমরা এটি আপনার উদাহরণ দিয়ে পরীক্ষা করতে পারি:

my.plot <- ggplot(data.frame(x = c(0, 0.456, 1), y = c(0, 0.123, 1))) +
             geom_point(aes(x, y), color = "red")

my.points <- get_x_y_values(my.plot)
my.points
#>           x         y
#> 1 0.1252647 0.1333251
#> 2 0.5004282 0.2330669
#> 3 0.9479917 0.9442339

এবং আমরা নিশ্চিত করতে পারি যে আপনার রেড পয়েন্টগুলিতে কিছু পয়েন্ট ছাঁটাই করে আমাদের মানগুলি এনপিসি সহ-আদেশ হিসাবে ব্যবহার করে এই মানগুলি সঠিক কিনা:

my.plot
grid::grid.draw(pointsGrob(x = my.points$x, y = my.points$y, default.units = "npc"))

2020-03-25 এ ডিপেক্স প্যাকেজ (v0.3.0) দ্বারা তৈরি করা হয়েছে


1
এই sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))অংশটি আজব। আপনি এখানে সংক্ষিপ্তসার কি বোঝাতে পারেন?
LBogaardt

1
@ এলগোগার্ড্ট panel_pos$tগ্রিডের সারি দেয় যেখানে (নমনীয়) প্যানেলটি বসেছে, সুতরাং এটির seq(panel_pos$t -1)উপরে থাকা সমস্ত সারি সংখ্যা রয়েছে এবং তাই sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))এই সারিগুলির উচ্চতার সমষ্টি।
অ্যালান ক্যামেরন ২

@ এলবোগার্ড আমি ব্রেভিটি এবং স্পষ্টতার মধ্যে ভারসাম্য বজায় রাখার চেষ্টা করছিলাম, তবে সম্ভবত আমি এই অধিকারটি খুব একটা পেলাম না ...
অ্যালান ক্যামেরন ২

আহ, সুতরাং একটি জিপিপ্লট একটি টেবিলের মতো, ওয়াই-লেবেলের জন্য একটি কলাম, ওয়াই-অক্ষ-সংখ্যাকরণের জন্য একটি ইত্যাদি r একইভাবে সারিগুলির জন্য, প্রতিটি প্রস্থ / উচ্চতা সহ। এই টেবিলের প্যানেল একটি ঘর আছে? বুঝেছি. ধন্যবাদ অ্যালান
এলবোগার্ড্ট

1
ঠিক, @ এলবোগার্ড প্রকৃতপক্ষে, ggplotGrob একটি জিটি টেবিল তৈরি করে, বা গ্রাব টেবিল
অ্যালান ক্যামেরন ২
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.