{"id":1141,"date":"2019-10-15T17:15:24","date_gmt":"2019-10-15T15:15:24","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=1141"},"modified":"2019-10-22T09:01:29","modified_gmt":"2019-10-22T07:01:29","slug":"des-graphes-bien-jolis","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/des-graphes-bien-jolis\/","title":{"rendered":"Des graphes bien jolis"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphes_et_tidyverse_ggraph\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>Dans ce billet, je vais me focaliser principalement sur <code>ggraph<\/code>, et j\u2019essaierai de trouver le temps pour parler un peu plus en profondeur de tidygraph un peu plus tard dans un autre billet.<\/p>\n<h1>Donn\u00e9es<\/h1>\n<p>Nous allons travailler sur cette table qui renseigne les <a href=\"..\/..\/lise.vaudor\/Rdata\/Graphes_et_tidyverse_ggraph\/vertices.csv\">noeuds<\/a> de notre r\u00e9seau, et cette autre table qui renseigne les <a href=\"..\/..\/lise.vaudor\/Rdata\/Graphes_et_tidyverse_ggraph\/edges.csv\">liens<\/a>.<\/p>\n<pre><code>nodes=read_csv(\"..\/..\/lise.vaudor\/Rdata\/Graphes_et_tidyverse_ggraph\/vertices.csv\")\r\nedges=read_csv(\"..\/..\/lise.vaudor\/Rdata\/Graphes_et_tidyverse_ggraph\/edges.csv\")\r\n<\/code><\/pre>\n<p>Pour aujourd\u2019hui, je vais utiliser une fonction de tidygraph (<code>tbl_graph()<\/code>) pour former \u00e0 partir de ces deux tables un objet de type graphe (et m\u00eame, plus pr\u00e9cis\u00e9ment, de classe \u201ctbl_graph\u201d). Je passe rapidement sur cette \u00e9tape, car j\u2019y reviendrai tr\u00e8s bient\u00f4t dans un autre billet\u2026<\/p>\n<pre><code>tib_g=tidygraph::tbl_graph(nodes=nodes,edges=edges) \r\n<\/code><\/pre>\n<p>De la m\u00eame mani\u00e8re qu\u2019avec la fonction <code>ggplot()<\/code> du package <code>ggplot2<\/code>, je cr\u00e9e ma premi\u00e8re \u201ccouche\u201d avec la fonction <code>ggraph()<\/code> du package <code>ggraph<\/code>:<\/p>\n<pre><code>g=tib_g %&gt;% \r\n   ggraph(layout=\"auto\")\r\n<\/code><\/pre>\n<p>Pour l\u2019instant, il n\u2019y a rien \u00e0 voir\u2026 mais je vais ensuite pouvoir exploiter les possibilit\u00e9s de <code>ggraph<\/code> pour la repr\u00e9sentation des noeuds et des liens.<\/p>\n<h1>Repr\u00e9sentation des noeuds<\/h1>\n<p>D\u2019abord, voici les possibilit\u00e9s pour les noeuds:<\/p>\n<pre><code>flowrpowr::flowr_package(\"ggraph\",element=\"geom_node\", layout=\"sugiyama\")\r\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphes_et_tidyverse_ggraph\/unnamed-chunk-1-1.png\" alt=\"\" \/><\/p>\n<p>Toutes n\u2019ont pas forc\u00e9ment un int\u00e9r\u00eat dans notre cas (c\u2019est fonction de la structure de notre graphe) donc je ne les testerai pas toutes, mais en voici quelques-unes adapt\u00e9es \u00e0 notre cas:<\/p>\n<pre><code>g1=g + geom_node_point(color=\"goldenrod\",size=3)\r\ng2=g + geom_node_label(aes(label=name),fill=\"steelblue\",alpha=0.2)\r\ng3=g + geom_node_text(aes(label=name), color=\"olivedrab\")\r\ng4=g + geom_node_circle(aes(fill=gender, r=0.3))\r\nlibrary(patchwork)\r\n(g1+g2)\/(g3+g4)\r\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphes_et_tidyverse_ggraph\/unnamed-chunk-2-1.png\" alt=\"\" \/><\/p>\n<p>Notez que l\u2019on retrouve les traits les plus commodes de ggplot2, comme l\u2019<strong>argument \u201cmapping\u201d<\/strong> qui permet de <strong>relier certaines caract\u00e9ristiques des geoms \u00e0 certaines variables dans notre jeu de donn\u00e9es<\/strong>\u2026<\/p>\n<h1>Repr\u00e9sentation des liens<\/h1>\n<p>Maintenant, voyons les possibilit\u00e9s pour la repr\u00e9sentation des liens:<\/p>\n<pre><code>flowrpowr::flowr_package(\"ggraph\",element=\"geom_edge\", layout=\"sugiyama\")\r\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphes_et_tidyverse_ggraph\/unnamed-chunk-3-1.png\" alt=\"\" \/><\/p>\n<p>Et \u00e0 nouveau, testons quelques-unes des possibilit\u00e9s:<\/p>\n<pre><code>g11=g1+geom_edge_link(color=\"steelblue\")\r\ng12=g1+geom_edge_arc(color=\"coral\")\r\ng13=g1+geom_edge_link(aes(edge_width=weight),color=\"olivedrab\", alpha=0.2)\r\ng14=g1+geom_edge_link(aes(edge_colour=relationship))\r\n(g11+g13)\/(g12+g14)\r\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphes_et_tidyverse_ggraph\/unnamed-chunk-4-1.png\" alt=\"\" \/><\/p>\n<h1>Facettes, \u00e9chelles, etc.<\/h1>\n<p>Evidemment, pour un \u201cvrai\u201d graphe, on va jouer sur tout en m\u00eame temps (les noeuds, les liens, la superposition des couches, les esth\u00e9tiques, etc.). <code>ggraph<\/code> permet \u00e9galement de cr\u00e9er des facettes d\u2019un m\u00eame graphe soit en fonction des noeuds, soit en fonction des liens<\/p>\n<pre><code>gf=g +\r\n  geom_edge_link(aes(edge_colour=relationship),\r\n                 alpha=0.3, edge_width=2)+\r\n  geom_node_label(aes(label=name, fill=gender),\r\n                  alpha=0.3, label.size=0)+\r\n  scale_edge_color_manual(values=c(\"couple\"=\"red\",\r\n                                   \"friends\"=\"blue\",\r\n                                   \"colleagues\"=\"dark grey\"))+\r\n  scale_fill_manual(values=c(\"man\"=\"yellow\",\"woman\"=\"orange\"))+\r\n  ggplot2::scale_x_continuous(expand=ggplot2::expand_scale(mult=0.1))\r\ngf\r\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphes_et_tidyverse_ggraph\/graph_it_all-1.png\" alt=\"\" \/><\/p>\n<p>(la derni\u00e8re ligne me permet simplement d\u2019\u00e9tendre l\u00e9g\u00e8rement l\u2019\u00e9chelle des abscisses afin que les noms ne soient pas coup\u00e9s sur les bords\u2026)<\/p>\n<p>On peut enfin <strong>facetter<\/strong> notre figure pour distinguer diff\u00e9rents sous-graphes, en lien soit avec une variable cat\u00e9gorielle d\u00e9crivant les noeuds (<code>facet_nodes()<\/code>), soit avec une variable cat\u00e9gorielle d\u00e9crivant les liens (<code>facet_edges()<\/code>).<\/p>\n<pre><code>gf_e=gf + facet_edges(~relationship)\r\ngf_n=gf + facet_nodes(~gender)\r\ngf_e\/gf_n\r\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphes_et_tidyverse_ggraph\/facetted_graphs-1.png\" alt=\"\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans ce billet, je vais me focaliser principalement sur ggraph, et j\u2019essaierai de trouver le temps pour parler un peu plus en profondeur de tidygraph un peu plus tard dans un autre billet. Donn\u00e9es Nous allons travailler sur cette table qui renseigne les noeuds de notre r\u00e9seau, et cette autre table qui renseigne les liens. nodes=read_csv(\u00ab\u00a0..\/..\/lise.vaudor\/Rdata\/Graphes_et_tidyverse_ggraph\/vertices.csv\u00a0\u00bb) edges=read_csv(\u00ab\u00a0..\/..\/lise.vaudor\/Rdata\/Graphes_et_tidyverse_ggraph\/edges.csv\u00a0\u00bb) Pour aujourd\u2019hui, je vais utiliser une fonction de tidygraph (tbl_graph()) pour former \u00e0.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/des-graphes-bien-jolis\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1141","post","type-post","status-publish","format-standard","hentry","category-tous-les-posts"],"_links":{"self":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/comments?post=1141"}],"version-history":[{"count":5,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1141\/revisions"}],"predecessor-version":[{"id":1170,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1141\/revisions\/1170"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=1141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=1141"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=1141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}