{"id":368,"date":"2015-02-16T11:05:15","date_gmt":"2015-02-16T10:05:15","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=368"},"modified":"2019-09-18T15:55:01","modified_gmt":"2019-09-18T13:55:01","slug":"graphes-pour-la-visualisation-de-reseaux","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/graphes-pour-la-visualisation-de-reseaux\/","title":{"rendered":"Graphes pour la visualisation de r\u00e9seaux"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Reseaux_graphes\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<h2>R\u00e9seaux et graphes: pour quoi faire?<\/h2>\n<p>Un <strong>graphe<\/strong> est un ensemble de <strong>points<\/strong> (ou sommets, ou noeuds, ou <em>vertices<\/em> en anglais) qui peuvent \u00eatre reli\u00e9s deux \u00e0 deux \u00e0 deux par un ou plusieurs <strong>liens<\/strong> (ou ar\u00eates, ou arcs, ou <em>edges<\/em> en anglais).<\/p>\n<p><sup><sub> Voil\u00e0 une d\u00e9finition on ne peut plus g\u00e9n\u00e9rale (et donc une m\u00e9thode on ne peut plus g\u00e9n\u00e9raliste!!). <\/sub><\/sup><\/p>\n<p>On peut en effet repr\u00e9senter par un graphe un grand nombre de types de donn\u00e9es relatives \u00e0 des <strong>\u00ab\u00a0r\u00e9seaux\u00a0\u00bb<\/strong> (<strong>liens<\/strong>, <strong>influences<\/strong>, <strong>partages<\/strong>, <strong>citations<\/strong>, <strong>\u00e9changes<\/strong>) etc&#8230;.<\/p>\n<p>Les <a href=\"http:\/\/www.stephendale.com\/2011\/03\/10\/knowledge-hub-4-social-graph-and-activity-stream\/\"><strong>r\u00e9seaux sociaux<\/strong><\/a> sont ainsi un exemple \u00ab\u00a0grand public\u00a0\u00bb d&rsquo;application des graphes. Par un graphe, en effet, on peut repr\u00e9senter qui est ami de qui (version Facebook), ou qui est follower de qui (version Twitter et ResearchGate), quelle est la distance qui s\u00e9pare un individu d&rsquo;un autre (en terme de nombre de liens par exemple), s&rsquo;il y a des \u00ab\u00a0communaut\u00e9s\u00a0\u00bb o\u00f9 la densit\u00e9 de liens est particuli\u00e8rement forte, etc&#8230;.<\/p>\n<p>Une autre application extr\u00eamement usuelle des graphes est la <strong>bibliom\u00e9trie<\/strong>, ou la <a href=\"http:\/\/textexture.com\/index.php\">textom\u00e9trie<\/a>. Dans ce cas on s&rsquo;applique, par exemple, \u00e0 repr\u00e9senter des liens ou <a href=\"http:\/\/www.coppelia.io\/2012\/06\/graphing-the-history-of-philosophy\/\">influences entre des auteurs<\/a>, ou des <a href=\"http:\/\/jgoodwin.net\/blog\/citational-network-graph-of-literary-theory-journals\/\">liens entre articles ou revues<\/a>, sur le mode \u00ab\u00a0qui cite qui\u00a0\u00bb.<\/p>\n<h2>Exemple<\/h2>\n<p>Consid\u00e9rons le jeu de donn\u00e9es suivant, comprenant une table relative aux <a href=\"..\/..\/lise.vaudor\/\/Rdata\/Reseaux_graphes\/edges.csv\">liens<\/a> et aux <a href=\"..\/..\/lise.vaudor\/\/Rdata\/Reseaux_graphes\/vertices.csv\">noeuds<\/a> du r\u00e9seau:<\/p>\n<pre><code>table_edges=read.table(paste(dat.path,\"edges.csv\",sep=\"\"),\n                         sep=\";\", header=T)\ntable_vertices=read.table(paste(dat.path,\"vertices.csv\",sep=\"\"),\n                         sep=\";\", header=T)\nhead(table_edges)\n\n##    Source   Target Weight   Label\n## 1 Sabrina    Cindy      2 friends\n## 2   Greta     Gina      2 friends\n## 3    Gina Fredrick      1  couple\n## 4   Greta    Bj\u00f6rn      1  couple\n## 5   Julia  Juliano      1  couple\n## 6   Julia    Greta      2 friends\n\nattach(table_edges)\nhead(table_vertices)\n\n##         Id    Label  Type\n## 1   Audrey   Audrey woman\n## 2  Beverly  Beverly woman\n## 3    Bj\u00f6rn    Bj\u00f6rn   man\n## 4  Caitlin  Caitlin woman\n## 5 Caitlin  Caitlin  woman\n## 6    Caleb    Caleb   man\n\nattach(table_vertices)\n<\/code><\/pre>\n<p>Ce jeu de donn\u00e9es d\u00e9crit les relations unissant 35 personnes. Sabrina est amie avec Cindy, Greta est amie avec Gina, Gina est en couple avec Fredrick, etc.<\/p>\n<p>Je vais utiliser le package <code>igraph<\/code> pour repr\u00e9senter les liens entre toutes ces personnes.<\/p>\n<pre><code>require(igraph)\n<\/code><\/pre>\n<p>Je r\u00e9alise un graphe non-orient\u00e9. C&rsquo;est-\u00e0-dire que je suppose que les liens entre les personnes sont sym\u00e9triques (si une personne <em>x<\/em> est amie avec une personne <em>y<\/em>, alors <em>y<\/em> est amie avec <em>x<\/em>&#8230;)<\/p>\n<pre><code>par(mar=c(0,0,0,0))\ng=graph.data.frame(table_edges, directed=FALSE)\ngraph_layout=layout.fruchterman.reingold(g)\nplot(g,layout=graph_layout)        \n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Reseaux_graphes\/graphe1-1.png\" alt=\"\" \/><\/p>\n<p>Gr\u00e2ce aux deux lignes de commande ci-dessus, j&rsquo;obtiens un beau(?) graphe.<\/p>\n<p><sup><sub> (Je ne sais pas pour vous mais moi je trouve \u00e7a trop magique!&#8230; m\u00eame si en l&rsquo;occurence, dans cet exemple c&rsquo;est un \u00ab\u00a0petit\u00a0\u00bb graphe de rien du tout) <\/sub><\/sup><\/p>\n<p>Je peux modifier son apparence, par exemple en faisant en sorte que Gina soit mise en avant dans le graphe:<\/p>\n<pre><code>par(mar=c(0,0,0,0))\nV(g)\n\n## Vertex sequence:\n##  [1] \"Sabrina\"   \"Greta\"     \"Gina\"      \"Julia\"     \"Juliano\"   \"Helen\"     \"Calista\"   \"Fabio\"     \"Audrey\"    \"Malcolm\"   \"Lisa\"      \"Cindy\"     \"Peter\"     \"Nelson\"    \"Terence\"   \"Greg\"      \"Eleanor\"   \"Caitlin\"   \"Natasha\"   \"Caleb\"     \"Robert\"    \"Tricia\"    \"Lorenzo\"   \"Renee\"     \"Beverly\"   \"Bj\u00f6rn\"     \"Jon\"       \"Mike\"      \"Fredrick\"  \"Philip\"    \"Liam\"      \"Preston\"   \"Kimberley\" \"Erica\"     \"Caitlin \"\n\nplot(g,layout=graph_layout, mark.group=3)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Reseaux_graphes\/graphe2-1.png\" alt=\"\" \/><\/p>\n<p>Je peux aussi modifier l&rsquo;apparence des ar\u00eates (edges), par exemple pour que le lien soit le plus \u00e9pais pour les couples (Weight=3), le moins \u00e9pais pour les coll\u00e8gues de travail (Weight=1) et interm\u00e9diaire pour les amis (Weight=2):<\/p>\n<pre><code>par(mar=c(0,0,0,0))\nplot(g,layout=graph_layout,edge.width=Weight)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Reseaux_graphes\/graphe3-1.png\" alt=\"\" \/><\/p>\n<h2>M\u00e9thode de trac\u00e9 des graphes<\/h2>\n<p>Une autre mani\u00e8re (plus \u00ab\u00a0profonde\u00a0\u00bb) de modifier l&rsquo;apparence du graphe est de modifier l&rsquo;algorithme de <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Trac%C3%A9_de_graphes\">trac\u00e9<\/a>. La mani\u00e8re ad\u00e9quate pour tracer de \u00ab\u00a0beaux\u00a0\u00bb graphes bien clairs a fait l&rsquo;objet d&rsquo;une litt\u00e9rature assez importante (et assez ancienne!) : voir par exemple Reingold, John, and Tilford (1981), Kamada and Kawai (1989), Fruchterman and Reingold (1991).<\/p>\n<p>En pratique, voil\u00e0 comment modifier la m\u00e9thode de trac\u00e9 avec le package <code>igraph<\/code>:<\/p>\n<pre><code>layout(matrix(1:4,nrow=2))\npar(mar=c(0,0,2,0))\nplot(g, layout=layout.circle,main=\"Circle\")\nplot(g, layout=layout.fruchterman.reingold,main=\"Fructerman-Reingold\")\nplot(g, layout=layout.reingold.tilford,main=\"Reingold-Tilford\")\nplot(g, layout=layout.kamada.kawai,main=\"Kamada-Kawai\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Reseaux_graphes\/graphe4-1.png\" alt=\"\" \/><\/p>\n<p>Notez que si les graphiques ci-dessus sont r\u00e9alis\u00e9s \u00e0 l&rsquo;aide d&rsquo;une fonction graphique \u00ab\u00a0classique\u00a0\u00bb, vous pouvez aussi cr\u00e9er un graphe <strong>interactif<\/strong> (qui vous permet, entre autres, de modifier l&rsquo;apparence et l&#8217;emplacement des vertices et des liens \u00ab\u00a0\u00e0 la main\u00a0\u00bb) avec la fonction suivante:<\/p>\n<pre><code>tkplot(g,layout=graph_layout)\n<\/code><\/pre>\n<h2>Pour aller plus loin<\/h2>\n<p>Je n&rsquo;ai pr\u00e9sent\u00e9 ici que le \u00ab\u00a0minimum vital\u00a0\u00bb pour r\u00e9aliser un graphe sous R&#8230; Pour en savoir plus sur le package <code>igraph<\/code> vous pouvez vous rendre sur <a href=\"http:\/\/igraph.org\/r\/\">le site qui lui est consacr\u00e9<\/a>.<\/p>\n<p>Enfin, si la construction de graphes vous int\u00e9resse particuli\u00e8rement mais que vous n&rsquo;\u00eates pas tr\u00e8s \u00e0 l&rsquo;aise avec R, je vous invite \u00e0 prendre connaissance du logiciel <a href=\"http:\/\/gephi.github.io\/\">Gephi<\/a>, un logiciel libre permettant d&rsquo;analyser et visualiser les r\u00e9seaux de mani\u00e8re assez conviviale.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>Fruchterman, Thomas M. J., and Edward M. Reingold. 1991. \u201cGraph Drawing by Force-Directed Placement.\u201d <em>Software: Practice and Experience<\/em> 21 (11): 1129\u201364. doi:<a href=\"http:\/\/dx.doi.org\/10.1002\/spe.4380211102\">10&#46;1002\/spe.4380211102<\/a>. <a href=\"http:\/\/doi.wiley.com\/10.1002\/spe.4380211102\">http:\/\/doi.wiley.com\/10.1002\/spe.4380211102<\/a>.<\/p>\n<p>Kamada, Tomihisa, and Satoru Kawai. 1989. \u201cAn Algorithm for Drawing General Undirected Graphs.\u201d <em>Information Processing Letters<\/em> 31 (1): 7\u201315. doi:<a href=\"http:\/\/dx.doi.org\/10.1016\/0020-0190(89)90102-6\">10&#46;1016\/0020-0190(89)90102-6<\/a>. <a href=\"http:\/\/linkinghub.elsevier.com\/retrieve\/pii\/0020019089901026\">http:\/\/linkinghub.elsevier.com\/retrieve\/pii\/0020019089901026<\/a>.<\/p>\n<p>Reingold, Edward M., John, and S. Tilford. 1981. \u201cTidier Drawing of Trees.\u201d <em>IEEE Trans. Software Eng<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>R\u00e9seaux et graphes: pour quoi faire? Un graphe est un ensemble de points (ou sommets, ou noeuds, ou vertices en anglais) qui peuvent \u00eatre reli\u00e9s deux \u00e0 deux \u00e0 deux par un ou plusieurs liens (ou ar\u00eates, ou arcs, ou edges en anglais). Voil\u00e0 une d\u00e9finition on ne peut plus g\u00e9n\u00e9rale (et donc une m\u00e9thode on ne peut plus g\u00e9n\u00e9raliste!!). On peut en effet repr\u00e9senter par un graphe un grand.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/graphes-pour-la-visualisation-de-reseaux\/\">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-368","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\/368","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=368"}],"version-history":[{"count":25,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/368\/revisions"}],"predecessor-version":[{"id":1116,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/368\/revisions\/1116"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}