{"id":647,"date":"2017-02-03T16:12:31","date_gmt":"2017-02-03T15:12:31","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=647"},"modified":"2019-08-16T13:35:28","modified_gmt":"2019-08-16T11:35:28","slug":"par-ici-les-jolies-cartes-avec-ggmap","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/par-ici-les-jolies-cartes-avec-ggmap\/","title":{"rendered":"Par ici les jolies cartes avec ggmap"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/ggmap\/Lise_Vaudor_headband-1.png\" alt=\"\" \/><\/p>\n<p>Aujourd&rsquo;hui est le d\u00e9but d&rsquo;une grande aventure puisque je me lance dans l&rsquo;<strong>espace<\/strong> (enfin, les donn\u00e9es spatiales, quoi), ce qui ne manquera pas de faire plaisir \u00e0 mes petits coll\u00e8gues g\u00e9ographes. Je vais commencer par vous montrer les possibilit\u00e9s du package <code>ggmap<\/code> qui comme son nom le laisse entendre est un peu le petit fr\u00e8re de <code>ggplot2<\/code> (dont je vous ai d\u00e9j\u00e0 parl\u00e9 <a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/par-ici-les-beaux-graphiques-avec-ggplot2\/\">ici<\/a>, et qui fait l&rsquo;objet d&rsquo;un cours <a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/Supports_formation\/Graphiques_ggplot2.html\">ici<\/a>), et qui est d\u00e9di\u00e9 \u00e0 la production de cartes tout en faisant usage des fonctionnalit\u00e9s de <code>ggplot2<\/code>.<\/p>\n<h1>Premier pas: le fond de carte<\/h1>\n<p>Dans ce post je vais m&rsquo;int\u00e9resser aux march\u00e9s alimentaires de la ville de Lyon (donn\u00e9es r\u00e9cup\u00e9r\u00e9es sur le <a href=\"http:\/\/www.lyon.fr\/page\/les-marches-lyonnais.html\">site de la ville<\/a>)<\/p>\n<p>Je vais donc r\u00e9cup\u00e9rer un fond de carte pour Lyon, dont les latitudes-longitudes sont lat=45.759723, lon=4.842223 (merci Wikipedia).<\/p>\n<p>Je charge <code>ggmap<\/code>, je renseigne les coordonn\u00e9es de Lyon, et je r\u00e9cup\u00e8re un fond de carte correspondant \u00e0 la ville de Lyon \u00e0 l&rsquo;aide de la fonction <code>get_map<\/code>.<\/p>\n<pre><code>require(ggmap)\nlyon=c(lat=45.759723, lon=4.842223)\nlyon_map=get_map(location=lyon,zoom=13)\nggmap(lyon_map)\n<\/code><\/pre>\n<p><em>Edit: Comme plusieurs utilisateurs me l&rsquo;ont fait remarquer, il faut d\u00e9sormais disposer d&rsquo;une API key Google pour t\u00e9l\u00e9charger des fonds de carte avec ggmap&#8230;<\/em><\/p>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/ggmap\/fond_de_carte-1.png\" alt=\"\" \/><\/p>\n<p>Ici, j&rsquo;ai \u00ab\u00a0t\u00e2tonn\u00e9\u00a0\u00bb pour trouver le niveau de zoom ad hoc mais il y a d&rsquo;autres mani\u00e8res de proc\u00e9der (par exemple en utilisant la fonction <code>calc_zoom<\/code> qui calcule le zoom adapt\u00e9 en fonction de l&rsquo;\u00e9tendue souhait\u00e9e).<\/p>\n<p>La fonction <code>get_map<\/code> a, outre les arguements <code>location<\/code>et <code>zoom<\/code>, deux arguments importants,<\/p>\n<ul>\n<li><code>maptype<\/code> qui pr\u00e9cise le type de carte souhait\u00e9 (\u00ab\u00a0terrain\u00a0\u00bb,\u00a0\u00bbsatellite\u00a0\u00bb,\u00a0\u00bbroadmap\u00a0\u00bb,\u00a0\u00bbhybrid\u00a0\u00bb, etc.)<\/li>\n<li><code>source<\/code> qui pr\u00e9cise la source des donn\u00e9es (\u00ab\u00a0google\u00a0\u00bb,\u00a0\u00bbosm\u00a0\u00bb -pour Open Street Map-, etc.)<\/li>\n<\/ul>\n<p><!-- --><\/p>\n<pre><code>lyon_map_2=get_map(location=lyon,zoom=13, \n                   maptype=\"satellite\")\nggmap(lyon_map_2)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/ggmap\/fond_de_carte_2-1.png\" alt=\"\" \/><\/p>\n<pre><code>lyon_map_3=get_map(location=lyon,zoom=13, \n                   maptype=\"watercolor\", source=\"stamen\")\nggmap(lyon_map_3)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/ggmap\/fond_de_carte_3-1.png\" alt=\"\" \/><\/p>\n<h1>Deuxi\u00e8me \u00e9tape: spatialiser notre jeu de donn\u00e9es<\/h1>\n<p>Consid\u00e9rons maintenant le jeu de donn\u00e9es <a href=\"..\/..\/lise.vaudor\/Rdata\/ggmap\/marches_lyonnais.csv\">marches_lyonnais.csv<\/a>:<\/p>\n<pre><code>data &lt;- read.csv(\"..\/..\/lise.vaudor\/Rdata\/ggmap\/marches_lyonnais.csv\", header=TRUE, sep=\";\")\nhead(data)\n\n##   ID               nom            localisation arrt n_com     jour heure\n## 1  1 Ambroise Courtois Place Ambroise Courtois    8    40    mardi matin\n## 2  1 Ambroise Courtois Place Ambroise Courtois    8    40    jeudi matin\n## 3  1 Ambroise Courtois Place Ambroise Courtois    8    40   samedi matin\n## 4  2     Ambroise Par\u00e9 Boulevard Ambroise Pare    8     1 mercredi matin\n## 5  2     Ambroise Par\u00e9 Boulevard Ambroise Pare    8     1 dimanche matin\n## 6  3            Bayard            Cours Bayard    2    13    jeudi matin\n<\/code><\/pre>\n<p>Pour l&rsquo;instant je n&rsquo;ai pas de coordonn\u00e9es spatiales pour mes donn\u00e9es. Je vais donc tenter de r\u00e9cup\u00e9rer des coordonn\u00e9es (de type latitude-longitude) \u00e0 partir des adresses. Pour cela on peut utiliser la fonction <code>geocode<\/code>.<\/p>\n<p>Je commence par utiliser les colonnes localisation et arrondissement de mon jeu de donn\u00e9es pour recr\u00e9er une adresse compl\u00e8te, et je me cr\u00e9e un petit jeu de donn\u00e9es data_loc comportant les identifiants uniques des march\u00e9s et l&rsquo;adresse correspondante:<\/p>\n<pre><code>adresse=paste0(data$localisation,\" 6900\",data$arrt,\" Lyon\")\ndata_loc=data.frame(ID=data$ID,\n                    adresse=adresse)\ndata_loc=unique(data_loc)\nhead(data_loc)\n\n##    ID                            adresse\n## 1   1 Place Ambroise Courtois 69008 Lyon\n## 4   2 Boulevard Ambroise Pare 69008 Lyon\n## 6   3            Cours Bayard 69002 Lyon\n## 8   4          Rue Bellecombe 69006 Lyon\n## 10  5        Place Belleville 69008 Lyon\n## 12  6  Place Benedict Tessier 69005 Lyon\n<\/code><\/pre>\n<p>Je peux alors utiliser <code>geocode<\/code> pour trouver les latitudes-longitudes correspondant aux adresses.<\/p>\n<pre><code>lonlat=geocode(as.vector(data_loc$adresse))\ndata_loc=data.frame(data_loc,lonlat)\nhead(data_loc)\n\n##    ID                            adresse      lon      lat\n## 1   1 Place Ambroise Courtois 69008 Lyon 4.871257 45.74473\n## 4   2 Boulevard Ambroise Pare 69008 Lyon 4.883713 45.73670\n## 6   3            Cours Bayard 69002 Lyon 4.821048 45.74397\n## 8   4          Rue Bellecombe 69006 Lyon 4.863359 45.76701\n## 10  5        Place Belleville 69008 Lyon 4.853576 45.73445\n## 12  6  Place Benedict Tessier 69005 Lyon 4.797599 45.75585\n<\/code><\/pre>\n<p>Je r\u00e9unis alors le tout dans le jeu de donn\u00e9es spatialis\u00e9 data_sp en r\u00e9alisant une jointure:<\/p>\n<pre><code>data_sp=merge(data,data_loc,by=\"ID\")\n<\/code><\/pre>\n<h1>Troisi\u00e8me \u00e9tape: superposer nos donn\u00e9es au fond de carte<\/h1>\n<p>C&rsquo;est \u00e0 partir de cette \u00e9tape que l&rsquo;on retrouve les outils de <code>ggplot2<\/code>. On peut par exemple reprendre le deuxi\u00e8me fond de carte, et superposer un geom \u00ab\u00a0point\u00a0\u00bb de la mani\u00e8re suivante:<\/p>\n<pre><code>ggmap(lyon_map_3)+\n  geom_point(data=data_sp, \n             aes(x=lon,y=lat), col=\"red\", size=2)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/ggmap\/carte_1-1.png\" alt=\"\" \/><\/p>\n<p>On peut ainsi exploiter les fonctionnalit\u00e9s les plus pratiques de <code>ggplot2<\/code>, comme le fait de pouvoir relier une variable \u00e0 une caract\u00e9ristique graphique (ici par exemple on relie la taille du point au nombre de commer\u00e7ants)<\/p>\n<pre><code>ggmap(lyon_map_3)+\n  geom_point(data=data_sp,\n             aes(x=lon,y=lat,size=n_com), col=\"red\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/ggmap\/carte_2-1.png\" alt=\"\" \/><\/p>\n<p>On peut aussi cr\u00e9er des \u00ab\u00a0facettes\u00a0\u00bb du m\u00eame graphique selon des facteurs (ici le jour: je commence donc ici en indiquant l&rsquo;ordre des jours qui sinon seraient simplement class\u00e9s par ordre alphab\u00e9tique)<\/p>\n<pre><code>levels(data_sp$jour)=c(\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\",\"dimanche\")\nggmap(lyon_map_3)+\n  geom_point(data=data_sp,\n             aes(x=lon,y=lat,size=n_com), col=\"red\")+\n  facet_wrap(~jour)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/ggmap\/carte_3-1.png\" alt=\"\" \/><\/p>\n<p>Remarquez que ci-dessus, j&rsquo;ai indiqu\u00e9 le jeu de donn\u00e9es et les esth\u00e9tiques de base (comme x et y) dans l&rsquo;appel \u00e0 la fonction <code>geom_point<\/code> et non dans l&rsquo;appel \u00e0 la fonction <code>ggmap<\/code>. Cela peut \u00eatre plus pratique d&rsquo;indiquer les informations de bases dans l&rsquo;appel \u00e0 <code>ggmap<\/code>, en particulier si l&rsquo;on superpose plusieurs geoms:<\/p>\n<pre><code>ggmap(lyon_map_3,\n      base_layer=ggplot(data=data_sp, aes(x=lon,y=lat))) +\n  geom_point(aes(size=n_com), col=\"red\") +\n  geom_text(aes(label=nom), color=\"grey60\",size=3)\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/ggmap\/carte_4-1.png\" alt=\"\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aujourd&rsquo;hui est le d\u00e9but d&rsquo;une grande aventure puisque je me lance dans l&rsquo;espace (enfin, les donn\u00e9es spatiales, quoi), ce qui ne manquera pas de faire plaisir \u00e0 mes petits coll\u00e8gues g\u00e9ographes. Je vais commencer par vous montrer les possibilit\u00e9s du package ggmap qui comme son nom le laisse entendre est un peu le petit fr\u00e8re de ggplot2 (dont je vous ai d\u00e9j\u00e0 parl\u00e9 ici, et qui fait l&rsquo;objet d&rsquo;un cours.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/par-ici-les-jolies-cartes-avec-ggmap\/\">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-647","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\/647","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=647"}],"version-history":[{"count":9,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/647\/revisions"}],"predecessor-version":[{"id":1091,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/647\/revisions\/1091"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}