{"id":540,"date":"2016-07-27T16:16:49","date_gmt":"2016-07-27T14:16:49","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=540"},"modified":"2017-11-15T14:09:42","modified_gmt":"2017-11-15T13:09:42","slug":"par-ici-les-beaux-graphiques-avec-ggplot2","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/par-ici-les-beaux-graphiques-avec-ggplot2\/","title":{"rendered":"Par ici les beaux graphiques avec ggplot2"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphiques_avec_ggplot2\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<h2>ggplot2: pour quoi faire?<\/h2>\n<p><strong>ggplot2<\/strong> est un des packages qui depuis quelques ann\u00e9es font fureur parmi les utilisateurs de R.<\/p>\n<p>ggplot2 est utilis\u00e9 pour r\u00e9aliser des graphiques. Il est b\u00e2ti selon une philosophie qui lui est propre (en l&rsquo;occurrence, inspir\u00e9e du livre \u00ab\u00a0The <strong>G<\/strong>rammar of <strong>G<\/strong>raphics\u00a0\u00bb de Leland Wilkinson, d&rsquo;o\u00f9 son nom ggplot), et qui le distingue des autres outils de production graphique sous R, notamment les fonctions graphiques \u00ab\u00a0de base\u00a0\u00bb comme \u00ab\u00a0hist\u00a0\u00bb, \u00ab\u00a0boxplot\u00a0\u00bb, etc.<\/p>\n<p>L&rsquo;id\u00e9e g\u00e9n\u00e9rale est de <strong>d\u00e9crire<\/strong> et donc <strong>produire<\/strong> un <strong>graphique<\/strong> comme un <strong>assemblage de couches<\/strong> (cela devrait parler aux SIGistes parmi vous&#8230;).<\/p>\n<p>Sans partir dans des consid\u00e9rations th\u00e9oriques (puisque rien n&rsquo;est plus parlant que des exemples, et ceux-ci viendront par la suite), disons que cela permet de produire des graphiques relativement complexes et riches en information, et ce de mani\u00e8re assez simple et conviviale.<\/p>\n<h2>Comment \u00e7a fonctionne?<\/h2>\n<p>Pour vous illustrer les principes et r\u00e9sultats graphiques du package ggplot2, je vais utiliser un jeu de donn\u00e9es issu de mon imagination fertile quoique mono-maniaque, et portant donc sur une population de chats, d\u00e9crits par les variables suivantes:<\/p>\n<ul>\n<li>haircolor: la couleur du poil (cat\u00e9goriel)<\/li>\n<li>hairpattern: le \u00ab\u00a0pattern\u00a0\u00bb color\u00e9 du poil (cat\u00e9goriel) (si vous voulez en savoir plus sur les couleurs et patterns de poils de chat vous pouvez aller voir <a href=\"http:\/\/images.google.fr\/imgres?imgurl=http%3A%2F2Forig07.deviantart.net%2Fb444%2Ff%2F2016%2F063%2Fc%2F6%2Fguide_to_cat_colors__patterns_by_majnouna-d1iivd0.jpg&amp;imgrefurl=http%3A%2F%2Fmajnouna.deviantart.com%2Fart%2FGuide-to-Cat-Colors-Patterns-91579716&amp;h=750&amp;w=1000&amp;tbnid=enoJcIINmdhp3M%3A&amp;docid=ht8GBDIl7PRfCM&amp;ei=DFaXV57mDJOXafGLraAF&amp;tbm=isch&amp;client=firefox-b-ab&amp;iact=rc&amp;uact=3&amp;dur=450&amp;page=2&amp;start=24&amp;ndsp=32&amp;ved=0ahUKEwienO-lj5HOAhWTSxoKHfFFC1QQMwhtKCUwJQ&amp;bih=793&amp;biw=1408\">ici<\/a>, c&rsquo;est fascinant)<\/li>\n<li>sex: le sexe du chat (cat\u00e9goriel)<\/li>\n<li>weight: son poids (quantitatif)<\/li>\n<li>age: son \u00e2ge (quantitatif)<\/li>\n<li>foodtype: le type d&rsquo;alimentation (cat\u00e9goriel)<\/li>\n<\/ul>\n<p><!-- --><\/p>\n<pre><code>catdata &lt;- read.csv(paste0(dat.path,\"catdata.csv\"), sep=\";\")\n<\/code><\/pre>\n<p>Remplacez paste0(dat.path,\u00a0\u00bbcatdata.csv\u00a0\u00bb) par le chemin du fichier sur votre propre ordinateur&#8230;<\/p>\n<p>Ce jeu de donn\u00e9es est t\u00e9l\u00e9chargeable <a href=\"..\/..\/lise.vaudor\/Rdata\/Graphiques_avec_ggplot2\/catdata.csv\">ici<\/a>.<\/p>\n<p>Commen\u00e7ons par charger le package ggplot2 -apr\u00e8s l&rsquo;avoir, si n\u00e9cessaire, install\u00e9-:<\/p>\n<pre><code>require(ggplot2)\n<\/code><\/pre>\n<h1>Les bases: jeu de donn\u00e9es, aethetics, et geoms<\/h1>\n<p>On <strong>cr\u00e9e<\/strong> un graphique \u00e0 l&rsquo;aide de la fonction <strong>ggplot<\/strong>. On sp\u00e9cifie sur quel <strong>jeu de donn\u00e9es<\/strong> le graphique va \u00eatre construit, ainsi que les \u00ab\u00a0<strong>aesthetics<\/strong>\u00a0\u00bb x et y:<\/p>\n<pre><code>p1a=ggplot(catdata,aes(x=haircolor,y=weight))\n#plot(p1a)\n<\/code><\/pre>\n<p>A ce stade, si l&rsquo;on trace p1a, le graphique qui s&rsquo;affiche n&rsquo;est pas tr\u00e8s informatif (figure 1.a)&#8230; En effet nous n&rsquo;avons pas pr\u00e9cis\u00e9 quel type d&rsquo;objet g\u00e9om\u00e9trique (\u00ab\u00a0<strong>geom<\/strong>\u00ab\u00a0) allait \u00eatre utilis\u00e9 pour repr\u00e9senter l&rsquo;information. Choisissons par exemple de repr\u00e9senter l&rsquo;information \u00e0 l&rsquo;aide d&rsquo;un <strong>geom \u00ab\u00a0point\u00a0\u00bb<\/strong>:<\/p>\n<pre><code>p1b=p1a+geom_point()\n#plot(p1b)\n<\/code><\/pre>\n<p>Cette fois le graphique affiche l&rsquo;information qui nous int\u00e9resse (figure 1.b).<\/p>\n<p>Remarquez comme on construit it\u00e9rativement le graphique&#8230; Pour construire p1b, on a repris p1a, et on lui a ajout\u00e9 un \u00ab\u00a0geom\u00a0\u00bb.<\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphiques_avec_ggplot2\/fig1-1.png\" alt=\"\" \/><\/p>\n<p>Si je souhaite r\u00e9aliser un graphique de type boxplot plut\u00f4t que point alors il faut que je modifie le type de \u00ab\u00a0geom\u00a0\u00bb que j&rsquo;utilise (figure 2.a).<\/p>\n<pre><code>p2a=p1a+geom_boxplot()\n#plot(p2a)\n<\/code><\/pre>\n<p>Evidemment tous <strong>les \u00ab\u00a0geoms\u00a0\u00bb peuvent \u00eatre param\u00e9tr\u00e9s<\/strong>. Je peux par exemple modifier la couleur de mes bo\u00eetes \u00e0 moustache de la fa\u00e7on suivante (figure 2.b):<\/p>\n<pre><code>p2b=p1a+geom_boxplot(fill=\"red\")\n#plot(p2b)\n<\/code><\/pre>\n<p>Je peux aussi non pas d\u00e9finir la couleur de remplissage de mani\u00e8re \u00ab\u00a0absolue\u00a0\u00bb mais en fonction des valeurs prises par une variable (en faisant du \u00ab\u00a0<strong>mapping<\/strong>\u00a0\u00bb -je n&rsquo;ai pas trouv\u00e9 de traduction ad\u00e9quate&#8230;-). Cette variable est alors une autre <strong>aesthetic<\/strong> (figure 2.c). Le graphique compte alors trois \u00ab\u00a0aesthetics\u00a0\u00bb. Les deux variables qui donnent les positions x et y des objets, et la variable \u00ab\u00a0haircolor\u00a0\u00bb qui donne la couleur de remplissage des objets.<\/p>\n<pre><code>p2c=p1a+geom_boxplot(aes(fill=haircolor))\n#plot(p2c)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphiques_avec_ggplot2\/fig2-1.png\" alt=\"\" \/><\/p>\n<p>Ici, l&rsquo;information affich\u00e9e par la couleur de remplissage est certes redondante avec celle donn\u00e9e par l&rsquo;axe x, mais on peut tr\u00e8s bien (et m\u00eame, c&rsquo;est fait pour cela) utiliser en \u00ab\u00a0aesthetic\u00a0\u00bb des variables autres que celles qui d\u00e9finissent x et y&#8230; Cela veut dire que l&rsquo;on peut tr\u00e8s simplement <strong>rajouter des couches d&rsquo;information<\/strong> (et les l\u00e9gendes correspondantes!) au graphique (figure 3.a).<\/p>\n<pre><code>p1a=ggplot(catdata,aes(x=haircolor,y=weight))\np3a=p1a+geom_boxplot(aes(fill=sex))\n#plot(p3a)\n<\/code><\/pre>\n<p>A ce stade, ggplot2 devrait d\u00e9j\u00e0 vous sembler d&rsquo;une intelligence et d&rsquo;une efficacit\u00e9 diaboliques&#8230;<\/p>\n<h1>R\u00e9sum\u00e9 statistique<\/h1>\n<p>C&rsquo;est sans mentionner le fait que l&rsquo;on puisse rajouter des couches d&rsquo;information \u00ab\u00a0statistique\u00a0\u00bb via la fonction stat_summary. Par exemple, on peut rajouter un geom \u00ab\u00a0point\u00a0\u00bb qui nous informe sur les moyennes par groupes -d\u00e9finis pour la variable x, c&rsquo;est \u00e0 dire \u00ab\u00a0haircolor\u00a0\u00bb- (figure 3.a).<\/p>\n<pre><code>p3b=p3a+stat_summary(fun.y=mean, \n                     geom=\"point\")\n<\/code><\/pre>\n<p>On peut calculer une statistique sur les autres \u00ab\u00a0aesthetics\u00a0\u00bb. Ici par exemple on combien les groupes donn\u00e9es par la variable \u00ab\u00a0haircolor\u00a0\u00bb et par la variable \u00ab\u00a0sex\u00a0\u00bb (figure 3.c):<\/p>\n<pre><code>p3c=p3a+stat_summary(fun.y=mean,\n                     geom=\"point\",\n                     aes(fill=sex))\n<\/code><\/pre>\n<p>Pour ajuster la position (en x) des moyennes en fonction de \u00ab\u00a0sex\u00a0\u00bb on peut proc\u00e9der comme suit (figure 3.d):<\/p>\n<pre><code>p3d=p3a+stat_summary(fun.y=mean,\n                     geom=\"point\",\n                     aes(fill=sex), \n                     position=position_dodge(width=0.75))\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphiques_avec_ggplot2\/fig3-1.png\" alt=\"\" \/><\/p>\n<h1>Titres, \u00e9chelles, axes<\/h1>\n<p>ggplot2 offre \u00e9galement des outils pour travailler facilement sur les probl\u00e8mes de titres, d&rsquo;\u00e9chelles et d&rsquo;axes. On peut ainsi facilement modifier les titres d&rsquo;axe (figure 4.a). Cette figure vous montre \u00e9galement un nouveau type de \u00ab\u00a0geom\u00a0\u00bb (un \u00ab\u00a0violon\u00a0\u00bb qui vous permet d&rsquo;appr\u00e9cier la distribution, un peu comme un \u00ab\u00a0histogramme \u00e0 la verticale\u00a0\u00bb):<\/p>\n<pre><code>p4=ggplot(catdata, aes(x=foodtype, y=age))\np4a=p4+geom_violin(fill=\"powderblue\")+xlab(\"type de nourriture\")+ylab(\"\u00e2ge\")\n#plot(p4a)\n<\/code><\/pre>\n<p>Un des aspects les plus int\u00e9ressants de ggplot2 est la facilit\u00e9 avec laquelle on peut transformer les variables de position x et y. Ici par exemple en travaillant sur une \u00e9chelle y log (figure 4b; dans ce cas particulier loguer les y n&rsquo;aide pas franchement \u00e0 la lecture du graphique mais passons!)<\/p>\n<pre><code>p4b=p4a+scale_y_log10()\n#plot(p4b)\n<\/code><\/pre>\n<p>On peut \u00e9galement d\u00e9finir des limites d&rsquo;axes (figure 4.c)<\/p>\n<pre><code>p4c=p4a+scale_y_continuous(limits=c(0,20))\n#plot(p4c)\n<\/code><\/pre>\n<p>Ou d\u00e9finir les endroits o\u00f9 les barres s&rsquo;affichent sur l&rsquo;axe (argument \u00ab\u00a0breaks\u00a0\u00bb), ainsi que les \u00e9tiquettes associ\u00e9es (argument \u00ab\u00a0labels\u00a0\u00bb).<\/p>\n<pre><code>p4d=p4a+\n    scale_y_continuous(limits=c(0,20),\n                       breaks=c(0,5,10,15),\n                       labels=c(\"b\u00e9b\u00e9\",\"jeune\",\"moyen\",\"\u00e2g\u00e9\"))+\n    scale_x_discrete(labels=c(\"dry\"=\"croquettes\",\n                              \"wet\"=\"p\u00e2t\u00e9e\",\n                              \"other\"=\"autre\"))\n\n#plot(p4d)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphiques_avec_ggplot2\/fig4-1.png\" alt=\"\" \/><\/p>\n<h1>Des graphiques \u00ab\u00a0\u00e0 facettes\u00a0\u00bb<\/h1>\n<p>Si pour le moment le concept de \u00ab\u00a0graphique \u00e0 facettes\u00a0\u00bb vous semble a priori moins s\u00e9duisant que celui de \u00ab\u00a0boule \u00e0 facettes\u00a0\u00bb, cela ne devrait pas durer&#8230;<\/p>\n<p>En effet, voyez plut\u00f4t:<\/p>\n<pre><code>p5a=p4d+facet_grid(hairpattern~.)\n#plot(p5a)\n<\/code><\/pre>\n<p>En un coup de cuill\u00e8re \u00e0 pot, on a \u00ab\u00a0multipli\u00e9\u00a0\u00bb les facettes de notre graphique, ici d\u00e9finies verticalement par la variable \u00ab\u00a0hairpattern\u00a0\u00bb (figure 5.a).<\/p>\n<p>On peut ainsi d\u00e9finir des facettes verticalement, horizontalement, ou les deux \u00e0 la fois, par exemple ici avec des facettes verticales correspondant \u00e0 la variable \u00ab\u00a0hairpattern\u00a0\u00bb et des facettes horizontales correspondant \u00e0 la variable \u00ab\u00a0sex\u00a0\u00bb (figure 5.b)<\/p>\n<pre><code>p5b=p2b+facet_grid(hairpattern~sex)\n#plot(p5b)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Graphiques_avec_ggplot2\/fig5-1.png\" alt=\"\" \/><\/p>\n<p>Puissant, non?<\/p>\n<h2>Un peu de lecture<\/h2>\n<p>J&rsquo;ai ici abord\u00e9 rapidement les principes et le fonctionnement du package ggplot2 en essayant, \u00e0 travers quelques exemples, de mettre en \u00e9vidence les fonctionnalit\u00e9s que je trouve les plus utiles. Ce billet est \u00e9videmment tr\u00e8s loin d&rsquo;\u00eatre exhaustif sur le sujet.<\/p>\n<p>Pas de quoi d\u00e9sesp\u00e9rer car, bien \u00e9videmment, les tutoriels, livres et billets de blog \u00e0 propos de ggplot2 pullulent sur la toile.<\/p>\n<p>Parmi les supports les plus utiles, il y a une <a href=\"https:\/\/www.rstudio.com\/wp-content\/uploads\/2015\/03\/ggplot2-cheatsheet.pdf\">\u00ab\u00a0antis\u00e8che ggplot2\u00a0\u00bb<\/a> qui donne \u00e0 voir les fonctionnalit\u00e9s de ce package en deux pages. Personnellement, je la garde toujours sous le coude (en fait, punais\u00e9e au mur \u00e0 c\u00f4t\u00e9 de mon ordi) pour me rafra\u00eechir la m\u00e9moire en cas de besoin.<\/p>\n<p>Pour ceux qui seraient encore dubitatifs quant \u00e0 l&rsquo;utilit\u00e9 de ggplot2, il existe des <a href=\"https:\/\/flowingdata.com\/2016\/03\/22\/comparing-ggplot2-and-r-base-graphics\/\">comparatifs<\/a> qui discutent des situations o\u00f9 les fonctionnalit\u00e9s graphiques de base de R sont suffisantes, ou au contraire des situations o\u00f9 l&rsquo;utilisation de ggplot2 est pr\u00e9f\u00e9rable.<\/p>\n<p>Si vous cherchez d&rsquo;autres exemples de graphiques r\u00e9alis\u00e9s avec ggplot2 (et bien entendu les lignes de commande qui les ont g\u00e9n\u00e9r\u00e9s!), vous pouvez aller voir d&rsquo;autres billets de blog comme <a href=\"http:\/\/bioinfo-fr.net\/guide-de-demarrage-pour-ggplot2-un-package-graphique-pour-r\">celui-ci<\/a> (en fran\u00e7ais) ou <a href=\"http:\/\/tutorials.iq.harvard.edu\/R\/Rgraphics\/Rgraphics.html\">celui-l\u00e0<\/a> (plus d\u00e9taill\u00e9, en anglais).<\/p>\n<p>Enfin pour les gens qui ne jurent que par les livres, il y a <a href=\"http:\/\/ggplot2.org\/book\/\">celui-ci<\/a> (dont on peut dire qu&rsquo;il s&rsquo;agit de la bible en la mati\u00e8re puisqu&rsquo;il a \u00e9t\u00e9 \u00e9crit par Hadley Wickham lui-m\u00eame, \u00e0 savoir le d\u00e9veloppeur du package).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ggplot2: pour quoi faire? ggplot2 est un des packages qui depuis quelques ann\u00e9es font fureur parmi les utilisateurs de R. ggplot2 est utilis\u00e9 pour r\u00e9aliser des graphiques. Il est b\u00e2ti selon une philosophie qui lui est propre (en l&rsquo;occurrence, inspir\u00e9e du livre \u00ab\u00a0The Grammar of Graphics\u00a0\u00bb de Leland Wilkinson, d&rsquo;o\u00f9 son nom ggplot), et qui le distingue des autres outils de production graphique sous R, notamment les fonctions graphiques \u00ab\u00a0de.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/par-ici-les-beaux-graphiques-avec-ggplot2\/\">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-540","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\/540","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=540"}],"version-history":[{"count":18,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/540\/revisions"}],"predecessor-version":[{"id":858,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/540\/revisions\/858"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=540"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=540"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=540"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}