ng ggplot2 में geom_point का निर्देशांक


10

मैं कैसे प्राप्त कर सकते हैं एक्स , वाई एक के निर्देशांक geom_point एक में ggplot , जहां संदर्भ फ्रेम पूरी साजिश रची छवि है?

मैं एक बना सकते हैं ggplot कुछ के साथ geom_point का उपयोग कर रों:

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

यह देता है:

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

एक में इस परिवर्तित करने पर Grob , मैं इस बारे में अतिरिक्त जानकारी निकाल सकते हैं ggplot साजिश पैनल के संबंध में निर्देशांक, बैंगनी तीर से चिह्नित की तरह,। हालांकि, यह कुल्हाड़ियों द्वारा उठाए गए स्थान की उपेक्षा करता है।

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

जब मैं हरे तीर द्वारा चिह्नित संपूर्ण छवि के निचले-बाएं कोने से मापना शुरू करता हूं , तो मैं x , y निर्देशांक कैसे प्राप्त कर सकता हूं ?

यदि यह संभव है, मैं ध्यान में रखना समाधान चाहते हैं विषय के ggplot । जैसे कोई विषय जोड़ना+ theme_void() कुल्हाड़ियों को प्रभावित करता है और पूरे प्लॉट की गई छवि के संबंध में बिंदुओं के स्थान को भी बदल देता है।

अद्यतन : मुझे एहसास हुआ कि कुल्हाड़ियों का फ़ॉन्ट आकार भूखंड की चौड़ाई और ऊंचाई के आधार पर बदलता है, जो भूखंड के पैनल के सापेक्ष आकार को प्रभावित करता है । इसलिए प्लॉट की चौड़ाई और प्लॉट की ऊंचाई को परिभाषित किए बिना एनपीसी इकाइयों में स्थान प्रदान करना तुच्छ नहीं होगा । यदि संभव हो, तो भूखंड की चौड़ाई और भूखंड की ऊंचाई के एक कार्य के रूप में जियोम_प्वाइंट्स का स्थान दें ।


5
2 डाउनवोट क्यों?
अंक

2
यदि आपकी चिंता या सुझाव है, तो कृपया टिप्पणी करें।
२३:१३ पर एलबोगार्ड्ट

1
इस बात पर विचार करें कि प्लॉट में निश्चित आयाम नहीं हैं - निरपेक्ष बिंदु स्थिति केवल उस डिवाइस के आकार पर निर्भर नहीं करती है जिस पर आप प्रिंट करते हैं, बल्कि आपके अक्षों के अनुपात पर भी। इसलिए काफी उत्सुक हैं कि आपको इसके लिए क्या चाहिए
त्बेबो

1
डाउनवोट्स के बारे में, ध्यान दें कि मुझे एसई पर एक वैध प्रश्न होने के लिए अपने प्रश्न को सही ठहराने की आवश्यकता नहीं है। मैं क्यों जानना चाहता हूं? क्योंकि मैं करता हूं।
२०:२

1
यह भी। लेकिन कभी भी असली जवाब नहीं मिला stackoverflow.com/questions/48710478/…
Tjebo

जवाबों:


5

जब आप ggplot का आकार बदलते हैं, तो पैनल के भीतर तत्वों की स्थिति npc स्थान पर निश्चित स्थिति में नहीं होती है। ऐसा इसलिए है क्योंकि प्लॉट के कुछ घटकों में निश्चित आकार होते हैं, और उनमें से कुछ (उदाहरण के लिए, पैनल) डिवाइस के आकार के अनुसार आयाम बदलते हैं।

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

एक और कठिनाई यह सुनिश्चित कर रही है कि आप पैनल ग्रो के भीतर सही खांचे की पहचान कर रहे हैं, और यह देखना मुश्किल है कि यह कैसे आसानी से सामान्यीकृत किया जा सकता है। सूची का उपयोग सबसेट कार्य करता है [[6]]और [[3]]आपके उदाहरण में अन्य भूखंडों के लिए सामान्य नहीं है।

वैसे भी, यह समाधान gtable के भीतर पैनल के आकार और स्थिति को मापने के द्वारा काम करता है, और npc अंतरिक्ष में बदलने के लिए milimetres में साजिश आयामों से विभाजित करने से पहले सभी आकारों को मिलीमीटर में परिवर्तित कर रहा है। मैंने संख्यात्मक सूचकांक के बजाय पैनल और अंकों को नाम से थोड़ा अधिक सामान्य बनाने की कोशिश की है।

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

और हम पुष्टि कर सकते हैं कि ये मान आपके बिंदुओं को npc सह-निर्देश के रूप में उपयोग करते हुए, आपके लाल बिंदुओं पर कुछ बिंदु ग्रब्स प्लॉट करके सही हैं:

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
@Logardt panel_pos$tग्रिड की पंक्ति देता है जिसमें (लचीला) पैनल बैठता है, इसलिए seq(panel_pos$t -1)इसके ऊपर सभी पंक्ति संख्याएँ हैं, और इसलिए sum(to_mm(gt$heights[seq(panel_pos$t - 1)]))इन पंक्तियों की ऊँचाई का योग है।
एलन कैमरन

@Logardt मैं संक्षिप्तता और स्पष्टता के बीच संतुलन बनाने की कोशिश कर रहा था, लेकिन शायद मुझे यह अधिकार नहीं मिला है ...
एलन कैमरन

आह, तो एक ggplot एक तालिका की तरह है, वाई-लेबल के लिए एक कॉलम के साथ, एक y- अक्ष-नंबरिंग के लिए। इसी तरह पंक्तियों के लिए, प्रत्येक चौड़ाई / ऊंचाई के साथ। पैनल इस तालिका में एक सेल है? समझ गया। धन्यवाद एलन।
एलबोगार्ड्ट

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