{"id":1210,"date":"2015-03-05T09:49:56","date_gmt":"2015-03-05T14:49:56","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/?p=1210"},"modified":"2017-05-01T10:10:51","modified_gmt":"2017-05-01T14:10:51","slug":"identifier-un-point-avec-ggplot2","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/identifier-un-point-avec-ggplot2\/","title":{"rendered":"Identifier un point avec ggplot2"},"content":{"rendered":"<p>Comme nous tous, vous vous \u00eates laiss\u00e9 s\u00e9duire par ggplot2. L&rsquo;\u00e9l\u00e9gance des graphes, la facilit\u00e9 de grouper les donn\u00e9es&#8230; Vous avez d\u00e9cid\u00e9 de convertir tous vos graphes en graphes ggplot2 pour ensuite vous rendre compte, apr\u00e8s tout vos efforts, que vous \u00e9tiez incapable d&rsquo;identifier un point d&rsquo;int\u00e9r\u00eat facilement. En effet, la fonction <strong>identify<\/strong> (qui permet de cliquer sur un point d&rsquo;un graphique pour r\u00e9cup\u00e9rer ses coordonn\u00e9es) ne fonctionne plus! Comment \u00e9tiquetter facilement le point <em>outlier<\/em> alors?<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-1203 aligncenter\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/02\/plot.png\" alt=\"plot\" width=\"400\" height=\"300\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/02\/plot-300x225.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/02\/plot.png 400w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/p>\n<p>Heureusement, il y a une solution. Elle implique par contre d&rsquo;aller voir sous la surface de ggplot2 afin d&rsquo;acc\u00e9der au syst\u00e8me de plus bas niveau sur lequel le <em>package<\/em> est construit, <strong>grid<\/strong>. Le module grid offre des m\u00e9thodes pour diviser une fen\u00eatre en plusieurs r\u00e9gions graphiques, chacune avec sa propre vues (<em>viewport<\/em>). Nous pouvons utiliser ces m\u00e9thodes pour acc\u00e9der \u00e0 la vue d&rsquo;un graphique et effectuer la conversion entre les coordonn\u00e9es \u00e0 l&rsquo;\u00e9cran et nos donn\u00e9es afin d&rsquo;identifier le point le plus proche.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-1201 aligncenter\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/02\/ggplot.png\" alt=\"ggplot\" width=\"400\" height=\"300\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/02\/ggplot-300x225.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/02\/ggplot.png 400w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/p>\n<p>Il existe, en fait, une hi\u00e9rarchie de vues pour chaque graphe ggplot2. Une fois le graphe cr\u00e9\u00e9, nous devons retrouver la vue appropri\u00e9e parmi toutes les vues associ\u00e9es au fond, au titre, aux axes, \u00e0 la l\u00e9gende, etc. Dans le cas le plus simple, cette vue se nomme <em>panel.3-4-3-4<\/em> et nous pouvons d\u00e9placer notre syst\u00e8me de coordonn\u00e9es pour y faire r\u00e9f\u00e9rence comme ceci :<\/p>\n<div>\n<pre><code class=\"r\">\r\nqplot(x, y) + xlim(c(0,10)) + xlim(c(0.1,0.5)) \r\ndownViewport('panel.3-4-3-4') \r\npushViewport(dataViewport(x, y, c(0,10), c(0.1, 0.5))) \r\n<\/code><\/pre>\n<\/div>\n<p>Nous pouvons ensuite r\u00e9cup\u00e9rer les coordonn\u00e9es de l&rsquo;\u00e9cran (en pouces, rien de moins!) en utilisant <strong>grid.locator<\/strong>. Ces coordonn\u00e9es sont relatives au coin inf\u00e9rieur gauche. Ensuite, nous n&rsquo;avons qu&rsquo;\u00e0 trouver le point parmi nos donn\u00e9es qui est le plus proche de ces coordonn\u00e9es. Pour ce faire, nous utilisons les m\u00e9thodes convertUnit pour transformer nos donn\u00e9es vers une \u00e9chelle en pouces.<\/p>\n<div>\n<pre><code class=\"r\">\r\npick.n <- as.numeric(pick)\r\nview.x <- as.numeric(convertX( unit(x,'native'), 'in' ))\r\nview.y <- as.numeric(convertY( unit(y,'native'), 'in' ))\r\nw <- which.min((view.x-pick.n[1])^2 + (view.y-pick.n[2])^2)\r\n<\/code><\/pre>\n<\/div>\n<p>Une fois ce point identifi\u00e9, nous pouvons simplement utiliser la m\u00e9thode <strong>annotate<\/strong> pour ajouter une \u00e9tiquette. Voici la fonction compl\u00e8te :<\/p>\n<div>\n<pre><code class=\"r\">\r\nggidentify 0.1) {\r\n      print(\"Closest point is too far\")\r\n    } else {  \r\n      popViewport(n=1)\r\n      upViewport(depth)\r\n      print(last_plot() + annotate(\"text\", label=labels[w], x = x[w], y = y[w], \r\n                                   size = 5, hjust=-0.5, vjust=-0.5))\r\n      depth <- downViewport('panel.3-4-3-4')\r\n      pushViewport(dataViewport(x,y, xscale, yscale))\r\n    }\r\n    pick <- grid.locator('in')\r\n  }\r\n  popViewport(n=1)\r\n  upViewport(depth)\r\n}<\/code><\/pre>\n<\/div>\n<p>\u00c9videmment, cette fonction n'est pas aussi satisfaisante que la fonction <strong> identify<\/strong> que nous avons essay\u00e9 d'imiter. Par exemple, il n'y a aucun historique conservant les points d\u00e9j\u00e0 identifi\u00e9s et \u00e9tiquett\u00e9s. Nous pourrions donc nous retrouver avec de multiples \u00e9tiquettes sur un m\u00eame point (si on le clique plusieurs fois), rendant le graphique illisible. Aussi, cette m\u00e9thode doit \u00eatre employ\u00e9e avant l'appel \u00e0 d'autre fonctions ggplot2 \u00e9tant donn\u00e9 que ces derni\u00e8res peuvent initier un changement d'\u00e9chelle automatique. Enfin, reconvertir toutes nos donn\u00e9es en pouces \u00e0 chaque clic n'est d\u00e9finitivement pas optimal!<\/p>\n<p>Malgr\u00e9 ces petits d\u00e9fauts, nous avons nos \u00e9tiquettes!<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-1216\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/03\/labeled.png\" alt=\"labeled\" width=\"699\" height=\"382\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/03\/labeled-300x164.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2015\/03\/labeled.png 699w\" sizes=\"(max-width: 699px) 100vw, 699px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Comme nous tous, vous vous \u00eates laiss\u00e9 s\u00e9duire par ggplot2. L&rsquo;\u00e9l\u00e9gance des graphes, la facilit\u00e9 de grouper les donn\u00e9es&#8230; Vous avez d\u00e9cid\u00e9 de convertir tous vos graphes en graphes ggplot2 pour ensuite vous rendre compte, apr\u00e8s tout vos efforts, que vous \u00e9tiez incapable d&rsquo;identifier un point d&rsquo;int\u00e9r\u00eat facilement. En effet, la fonction identify (qui permet de cliquer sur un point d&rsquo;un graphique pour r\u00e9cup\u00e9rer ses coordonn\u00e9es) ne fonctionne plus! Comment \u00e9tiquetter facilement le point outlier alors? Heureusement, il y a <a href=\"https:\/\/bioinfo.iric.ca\/fr\/identifier-un-point-avec-ggplot2\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[41,24,44],"tags":[118],"class_list":["post-1210","post","type-post","status-publish","format-standard","hentry","category-bioinformatique","category-langage-r","category-visualisation-de-donnees","tag-ggplot2"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1210","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=1210"}],"version-history":[{"count":12,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1210\/revisions"}],"predecessor-version":[{"id":3326,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1210\/revisions\/3326"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=1210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=1210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=1210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}