tag:linuxfr.org,2005:/tags/r/publicLinuxFr.org : les contenus étiquetés avec « r »2022-08-18T21:38:24+02:00/favicon.pngtag:linuxfr.org,2005:Bookmark/49612022-07-25T17:56:01+02:002022-07-25T17:56:01+02:00Conférence RStudio : présentations accessibles en direct en ligne les 27 et 28 juillet<a href="https://www.rstudio.com/conference/">https://www.rstudio.com/conference/</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/128363/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pompoko/liens/conference-rstudio-presentations-accessibles-en-direct-en-ligne-les-27-et-28-juillet#comments">ouvrir dans le navigateur</a>
</p>
Matthieuhttps://linuxfr.org/nodes/128363/comments.atomtag:linuxfr.org,2005:News/408042021-12-20T20:50:23+01:002021-12-20T20:50:23+01:00Décès de Leland Wilkinson, « parrain » du paquet ggplot2 de RLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Leland Wilkinson était un chercheur américain ayant contribué à la discipline de la visualisation des données. Il est l’auteur du livre <em>Grammar of Graphics</em> en 1999, et a notamment aidé un des cocréateurs du paquet <code>ggplot2</code> de <code>R</code> à en faire son implémentation. Son décès a été annoncé le 13 décembre 2021 sur le blog spécialisé <a href="https://flowingdata.com/"><em>Flowing Data</em></a>.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://flowingdata.com/2021/12/13/leland-wilkinson-creator-of-the-grammar-of-graphics-passed-away/" hreflang="en" href="https://linuxfr.org/redirect/109605">Annonce du décés sur Flowing Data</a></li><li>lien nᵒ 2 : <a title="https://www.cs.uic.edu/~wilkinson/" hreflang="en" href="https://linuxfr.org/redirect/109606">Présentation de Leland Wilkinson (Université de L'Illinois, Chicago)</a></li><li>lien nᵒ 3 : <a title="https://www.cs.uic.edu/~wilkinson/Publications/wilkinsonvita.pdf" hreflang="en" href="https://linuxfr.org/redirect/109607">CV en PDF</a></li><li>lien nᵒ 4 : <a title="https://twitter.com/hadleywickham/status/1470419734487347200" hreflang="en" href="https://linuxfr.org/redirect/109608">Hommage de Hadley Wickham, créateur de ggplot2 (Twitter)</a></li><li>lien nᵒ 5 : <a title="https://statmodeling.stat.columbia.edu/2021/12/12/wilkinsons-contribution-to-interactive-visualization/" hreflang="en" href="https://linuxfr.org/redirect/109609">Hommage de Jessica Hullman</a></li><li>lien nᵒ 6 : <a title="https://www.h2o.ai/leland/" hreflang="en" href="https://linuxfr.org/redirect/109610">Hommage de l'entreprise H2O.ai et formulaire pour les messages de condoléance</a></li><li>lien nᵒ 7 : <a title="https://link.springer.com/book/10.1007/0-387-28695-0" hreflang="en" href="https://linuxfr.org/redirect/109611">Le livre "Grammar of Graphics" (Springer)</a></li><li>lien nᵒ 8 : <a title="https://research.tableau.com/user/leland-wilkinson" hreflang="en" href="https://linuxfr.org/redirect/109612">Présentation de Leland Wilkinson (Tableau)</a></li><li>lien nᵒ 9 : <a title="https://superscholar.org/interviews/leland-wilkinson/" hreflang="en" href="https://linuxfr.org/redirect/109615">Interview de SuperScholar sur SYSTAT et sur "Grammar of Graphics" (2010)</a></li><li>lien nᵒ 10 : <a title="https://en.wikipedia.org/wiki/Leland_Wilkinson" hreflang="en" href="https://linuxfr.org/redirect/109618">Page wikipédia de Leland Wilkinson</a></li></ul><div><p>Titulaire d’un diplôme de théologie à Harvard Divinity School initialement pour devenir chapelain, il s’est découvert un intérêt pour les statistiques et l’informatique durant son doctorat de psychologie à l’université de Yale au début des années 1970.</p>
<p>Wilkinson a, durant sa vie professionnelle, concilié son parcours académique d’enseignant vacataire dans les universités de l’Illinois de Chicago et de Northwestern avec sa carrière d’entrepreneur.</p>
<p>Après quelques expériences de consultant en statistique avec divers organismes de recherche et des hôpitaux, il a créé le logiciel <a href="https://en.wikipedia.org/wiki/SYSTAT_(software)">SYSTAT</a> qui a popularisé la notion de <a href="https://fr.wikipedia.org/wiki/Heat_map">carte de chaleur</a> pour la visualisation des données et a fondé la société du même nom en 1984 avec l’aide de sa femme juriste. Il a revendu sa première entreprise à <a href="https://en.wikipedia.org/wiki/SPSS_Inc.">SPSS</a> en 1994 pour pouvoir se recentrer un temps sur la recherche académique. Il a rejoint par la suite divers organismes dont le <a href="https://en.wikipedia.org/wiki/National_Institute_of_Statistical_Sciences">NISS</a> et l’<a href="https://en.wikipedia.org/wiki/American_Statistical_Association">American Statistical Association</a>.</p>
<p>Wilkinson reprendra plus activement la vie des affaires dans les années 2010. Ses derniers postes ont été vice-président des statistiques chez <a href="https://fr.wikipedia.org/wiki/Tableau_Software">Tableau Software</a> en 2014, puis directeur scientifique chez <a href="https://fr.wikipedia.org/wiki/H2O_(logiciel)">H2O.ai</a> à partir de 2016. Il est décédé le 10 décembre 2021 des suites d’un AVC selon son dernier employeur.</p>
<p>Parmi les hommages cités par l’annonce de décès du blog <em>Flowing Data</em>, nous avons <a href="https://en.wikipedia.org/wiki/Hadley_Wickham">Hadley Wikcham</a>, coauteur de <a href="https://en.wikipedia.org/wiki/Ggplot2">ggplot2</a> (sous licence MIT), qui s’est souvenu de Wilkinson comme un soutien déterminant pour son projet de paquet R durant ses études supérieures, et <a href="https://en.wikipedia.org/wiki/Jessica_Hullman">Jessica Hullman</a>, chercheuse en visualisation des données, qui a fait part de son admiration pour <em>Grammar of Graphics.</em> L’équipe de H2O.ai a également tenu à honorer la mémoire de leur directeur scientifique en soulignant ses qualités humaines et a mis en ligne un formulaire où il est possible de mettre ses propres messages de condoléance.</p>
</div><div><a href="https://linuxfr.org/news/deces-de-leland-wilkinson-parrain-du-paquet-ggplot2-de-r.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/126318/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/deces-de-leland-wilkinson-parrain-du-paquet-ggplot2-de-r#comments">ouvrir dans le navigateur</a>
</p>
voltsYsabeau 🧶 🧦vmagninBenoît Sibaudhttps://linuxfr.org/nodes/126318/comments.atomtag:linuxfr.org,2005:Diary/399222021-09-18T22:18:32+02:002021-09-18T22:18:32+02:00Préparation de figures avec R : automatiser l'ajout d'annotations manuellesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-le-contexte-en-d%C3%A9tail">Le contexte en détail</a></li>
<li><a href="#toc-lapproche-propos%C3%A9e">L'approche proposée</a></li>
<li>
<a href="#toc-un-exemple-d%C3%A9taill%C3%A9">Un exemple détaillé</a><ul>
<li><a href="#toc-1---pr%C3%A9paration-de-la-figure-de-base-avec-r">1 - Préparation de la figure de base avec R</a></li>
<li><a href="#toc-2---pr%C3%A9paration-des-annotations-manuelles-avec-inkscape">2 - Préparation des annotations manuelles avec Inkscape</a></li>
<li><a href="#toc-3---automatisation-de-lajout-des-annotations-manuelles-%C3%A0-la-figure-g%C3%A9n%C3%A9r%C3%A9e-par-r">3 - Automatisation de l'ajout des annotations manuelles à la figure générée par R</a></li>
</ul>
</li>
<li><a href="#toc-conclusion">Conclusion</a></li>
</ul>
<p><a href="https://www.r-project.org/">R</a> est un <a href="https://fr.wikipedia.org/wiki/R_(langage)">outil libre destiné aux statistiques</a> utilisé pour l'analyse de données et la production de figures scientifiques. Une bonne reproductibilité des résultats peut être obtenue en utilisant des scripts R et un logiciel de gestion de version comme <a href="https://git-scm.com/">Git</a>. Néanmoins, il est parfois pratique d'ajouter quelques annotations à la main sur une figure, ce qui va à l'encontre de la reproductibilité désirée.</p>
<p>Ce journal présente une approche permettant d'incorporer ces <strong>annotations manuelles</strong> dans une figure de manière <strong>automatique</strong> et <strong>reproductible</strong>. J'espère qu'il pourra être utile aux lectrices et lecteurs de LinuxFr qui utilisent R et qui ont pu rencontrer ce problème par le passé !</p>
<h2 id="toc-le-contexte-en-détail">Le contexte en détail</h2>
<p>R est très utilisé en recherche pour analyser des données ainsi que pour réaliser des figures à partir de ces données. Un (ou plusieurs) script R peut contenir toutes les étapes de nettoyage des données brutes, d'analyse statistique, et finalement de préparation des tableaux de résultats et des figures destinés à la publication dans des revues scientifiques.</p>
<p>L'utilisation de script(s) est très utile pour reproduire les analyses de manière fiable, par exemple lorsque le jeu de données original est mis à jour : il suffit de relancer le ou les scripts pour automatiquement mettre à jour toutes les étapes en aval, y compris les tableaux et les figures finals.</p>
<p>Un léger problème survient assez souvent lors de la préparation de figures élaborées : même si R permet de dessiner pratiquement n'importe quelle figure, il peut être plus rapide pour certaines annotations (typiquement des éléments de légende) d'utiliser un logiciel tierce comme <a href="https://inkscape.org/fr/">Inkscape</a> pour ajouter à la main quelques éléments au fichier <a href="https://fr.wikipedia.org/wiki/Scalable_Vector_Graphics">svg</a> ou <a href="https://fr.wikipedia.org/wiki/Portable_Document_Format">pdf</a> produit par R, plutôt que de les définir laborieusement avec du code R.</p>
<p>Cette étape manuelle implique que la génération des figures n'est plus 100% automatique : après une mise à jour des données, il faudra répéter l'étape d'annotation manuelle de la figure. Si ce n'est pas un problème à faire une fois ou deux, cela devient plus ennuyeux si le jeu de données est amené à être mis à jour souvent, ou si l'analyse fait partie d'un pipeline plus important géré par un Makefile<sup id="fnref1"><a href="#fn1">1</a></sup> par exemple. </p>
<p>Dans cette situation, il peut être intéressant d'automatiser cette dernière étape manuelle. Ce journal propose une approche simple pour ajouter des annotations manuelles de manière automatique à une figure générée par R.</p>
<h2 id="toc-lapproche-proposée">L'approche proposée</h2>
<p>En quelques mots, l'idée est de sauvegarder les annotations faites à la main dans un fichier svg séparé, et d'utiliser quelques lignes de code pour superposer le contenu de ce fichier à la figure produite par R.</p>
<p>Dans la figure ci-dessous, l'approche de gauche est celle dans laquelle l'intervention manuelle est nécessaire à chaque exécution du pipeline ; celle de droite est l'approche présentée dans ce journal, où l'étape manuelle n'a lieu qu'une seule fois.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f6d657267696e672d7376672d722d6f766572766965772e737667/merging-svg-r-overview.svg" alt="Vue générale de l'approche proposée pour fusionner des annotations SVG dans une figure générée avec R" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/merging-svg-r-overview.svg"></p>
<p><em>Comparaison de deux approches possibles pour ajouter des annotations manuelles dans une figure générée avec R. Celle de droite, présentée ici, a l'avantage de ne pas nécessiter une étape manuelle à chaque exécution.</em></p>
<p>Notons que dans l'approche proposée à droite, l'ensemble du travail peut être intégralement suivi par Git : le <strong>script R</strong> qui sert à générer la figure incomplète, le <strong>fichier svg d'Inkscape</strong> qui est un fichier texte, et le <strong>script R</strong> qui sert à fusionner les deux fichiers svg (la figure générée par R et celle avec les annotations manuelles).</p>
<h2 id="toc-un-exemple-détaillé">Un exemple détaillé</h2>
<h3 id="toc-1---préparation-de-la-figure-de-base-avec-r">1 - Préparation de la figure de base avec R</h3>
<p>Imaginons que l'on souhaite dessiner une figure présentant la taille de certaines grandes villes françaises. Chaque ville est représentée par un rectangle dont les dimensions sont judicieusement calculées afin de donner une idée de la taille des villes à la fois du point de vue du nombre d'habitants et de celui de la superficie occupée.</p>
<p>Le code ci-dessous prépare les données et enregistre une figure au format svg sous le nom <code>figure-de-base.svg</code>:</p>
<pre><code class="r"><span class="kn">library</span><span class="p">(</span>tibble<span class="p">)</span>
<span class="c1"># Données</span>
z <span class="o"><-</span> tibble<span class="o">::</span>tribble<span class="p">(</span>
<span class="o">~</span>ville<span class="p">,</span> <span class="o">~</span>lat<span class="p">,</span> <span class="o">~</span>lon<span class="p">,</span> <span class="o">~</span>superficie_km2<span class="p">,</span> <span class="o">~</span>habitants<span class="p">,</span>
<span class="s">"Paris"</span><span class="p">,</span> <span class="m">48.86</span><span class="p">,</span> <span class="m">2.35</span><span class="p">,</span> <span class="m">105.4</span><span class="p">,</span> <span class="m">2175601</span><span class="p">,</span>
<span class="s">"Marseille"</span><span class="p">,</span> <span class="m">43.3</span><span class="p">,</span> <span class="m">5.37</span><span class="p">,</span> <span class="m">240.62</span><span class="p">,</span> <span class="m">868277</span><span class="p">,</span>
<span class="s">"Lyon"</span><span class="p">,</span> <span class="m">45.76</span><span class="p">,</span> <span class="m">4.83</span><span class="p">,</span> <span class="m">47.87</span><span class="p">,</span> <span class="m">518635</span><span class="p">,</span>
<span class="s">"Toulouse"</span><span class="p">,</span> <span class="m">43.6</span><span class="p">,</span> <span class="m">1.44</span><span class="p">,</span> <span class="m">118.3</span><span class="p">,</span> <span class="m">486828</span><span class="p">,</span>
<span class="s">"Nice"</span><span class="p">,</span> <span class="m">43.7</span><span class="p">,</span> <span class="m">7.27</span><span class="p">,</span> <span class="m">71.92</span><span class="p">,</span> <span class="m">341032</span><span class="p">,</span>
<span class="s">"Nantes"</span><span class="p">,</span> <span class="m">47.22</span><span class="p">,</span> <span class="m">-1.55</span><span class="p">,</span> <span class="m">65.19</span><span class="p">,</span> <span class="m">314138</span><span class="p">,</span>
<span class="s">"Montpellier"</span><span class="p">,</span> <span class="m">43.61</span><span class="p">,</span> <span class="m">3.88</span><span class="p">,</span> <span class="m">56.88</span><span class="p">,</span> <span class="m">290053</span><span class="p">,</span>
<span class="s">"Strasbourg"</span><span class="p">,</span> <span class="m">48.57</span><span class="p">,</span> <span class="m">7.75</span><span class="p">,</span> <span class="m">78.26</span><span class="p">,</span> <span class="m">284677</span><span class="p">,</span>
<span class="s">"Bordeaux"</span><span class="p">,</span> <span class="m">44.84</span><span class="p">,</span> <span class="m">-0.58</span><span class="p">,</span> <span class="m">49.36</span><span class="p">,</span> <span class="m">257068</span><span class="p">,</span>
<span class="s">"Lille"</span><span class="p">,</span> <span class="m">50.64</span><span class="p">,</span> <span class="m">3.06</span><span class="p">,</span> <span class="m">34.51</span><span class="p">,</span> <span class="m">233098</span><span class="p">,</span>
<span class="s">"Rennes"</span><span class="p">,</span> <span class="m">48.11</span><span class="p">,</span> <span class="m">-1.68</span><span class="p">,</span> <span class="m">50.39</span><span class="p">,</span> <span class="m">217728</span><span class="p">,</span>
<span class="s">"Reims"</span><span class="p">,</span> <span class="m">49.26</span><span class="p">,</span> <span class="m">4.03</span><span class="p">,</span> <span class="m">47.02</span><span class="p">,</span> <span class="m">182211</span><span class="p">,</span>
<span class="s">"Toulon"</span><span class="p">,</span> <span class="m">43.12</span><span class="p">,</span> <span class="m">5.93</span><span class="p">,</span> <span class="m">42.84</span><span class="p">,</span> <span class="m">176198</span><span class="p">,</span>
<span class="s">"Saint-Étienne"</span><span class="p">,</span> <span class="m">45.43</span><span class="p">,</span> <span class="m">4.39</span><span class="p">,</span> <span class="m">79.97</span><span class="p">,</span> <span class="m">173089</span><span class="p">,</span>
<span class="s">"Le Havre"</span><span class="p">,</span> <span class="m">49.49</span><span class="p">,</span> <span class="m">0.1</span><span class="p">,</span> <span class="m">46.95</span><span class="p">,</span> <span class="m">169733</span><span class="p">,</span>
<span class="s">"Brest"</span><span class="p">,</span> <span class="m">48.39</span><span class="p">,</span> <span class="m">-4.49</span><span class="p">,</span> <span class="m">49.51</span><span class="p">,</span> <span class="m">139602</span><span class="p">,</span>
<span class="s">"Biarritz"</span><span class="p">,</span> <span class="m">43.48</span><span class="p">,</span> <span class="m">-1.56</span><span class="p">,</span> <span class="m">11.66</span><span class="p">,</span> <span class="m">25532</span>
<span class="p">)</span>
z<span class="o">$</span>densite <span class="o"><-</span> z<span class="o">$</span>habitants <span class="o">/</span> z<span class="o">$</span>superficie_km2
<span class="c1"># Figure sauvegardée dans un fichier svg</span>
svg<span class="p">(</span><span class="s">"figure-de-base.svg"</span><span class="p">,</span> width <span class="o">=</span> <span class="m">8</span><span class="p">,</span> height <span class="o">=</span> <span class="m">5</span><span class="p">,</span> family <span class="o">=</span> <span class="s">"serif"</span><span class="p">)</span>
<span class="c1"># Pour laisser de la place aux annotations manuelles sur le côté</span>
par<span class="p">(</span>fig <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0.7</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">))</span>
<span class="c1"># plot() avec 'asp = 1.6' pour avoir un aspect correct à cette latitude</span>
plot<span class="p">(</span><span class="kc">NA</span><span class="p">,</span> type <span class="o">=</span> <span class="s">"n"</span><span class="p">,</span> xlab <span class="o">=</span> <span class="s">"Longitude"</span><span class="p">,</span> ylab <span class="o">=</span> <span class="s">"Latitude"</span><span class="p">,</span>
xlim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">-6</span><span class="p">,</span> <span class="m">10</span><span class="p">),</span> ylim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">42</span><span class="p">,</span> <span class="m">52</span><span class="p">),</span> asp <span class="o">=</span> <span class="m">1.6</span><span class="p">,</span> las <span class="o">=</span> <span class="m">1</span><span class="p">,</span> bty <span class="o">=</span> <span class="s">"n"</span><span class="p">)</span>
<span class="c1"># ADJ_W et ADJ_H permettent d'ajuster les dimensions des villes à la volée</span>
ADJ_W <span class="o"><-</span> <span class="m">8e-3</span>
ADJ_H <span class="o"><-</span> <span class="m">1.5e-4</span>
<span class="c1"># Dessin d'un rectangle par ville (i.e. par ligne du tableau `z`)</span>
<span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="kp">seq_len</span><span class="p">(</span><span class="kp">nrow</span><span class="p">(</span>z<span class="p">)))</span> <span class="p">{</span>
x0 <span class="o"><-</span> z<span class="o">$</span>lon<span class="p">[</span>i<span class="p">]</span>
y0 <span class="o"><-</span> z<span class="o">$</span>lat<span class="p">[</span>i<span class="p">]</span>
w <span class="o"><-</span> z<span class="o">$</span>superficie_km2<span class="p">[</span>i<span class="p">]</span> <span class="o">*</span> ADJ_W
h <span class="o"><-</span> z<span class="o">$</span>densite<span class="p">[</span>i<span class="p">]</span> <span class="o">*</span> ADJ_H
points<span class="p">(</span>x0<span class="p">,</span> y0<span class="p">,</span> pch <span class="o">=</span> <span class="m">4</span><span class="p">)</span>
rect<span class="p">(</span>x0 <span class="o">-</span> w<span class="o">/</span><span class="m">2</span><span class="p">,</span> y0<span class="p">,</span> x0 <span class="o">+</span> w<span class="o">/</span><span class="m">2</span><span class="p">,</span> y0 <span class="o">+</span> h<span class="p">,</span> col <span class="o">=</span> grey<span class="p">(</span><span class="m">0.8</span><span class="p">))</span>
text<span class="p">(</span>x0<span class="p">,</span> y0<span class="p">,</span> z<span class="o">$</span>ville<span class="p">[</span>i<span class="p">],</span> pos <span class="o">=</span> <span class="m">1</span><span class="p">)</span>
<span class="p">}</span>
<span class="c1"># Fermeture du fichier graphique</span>
dev.off<span class="p">()</span></code></pre>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f6d657267696e672d7376672d722d6669677572652d64652d626173652e737667/merging-svg-r-figure-de-base.svg" alt="Figure de base sans annotations" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/merging-svg-r-figure-de-base.svg"></p>
<p><em>Figure de base générée par R, sans la légende manuelle. Le code qui produit cette figure est écrit de manière à laisser de l'espace sur la droite pour l'ajout ultérieur des annotations.</em></p>
<h3 id="toc-2---préparation-des-annotations-manuelles-avec-inkscape">2 - Préparation des annotations manuelles avec Inkscape</h3>
<p>À présent que l'on dispose de la figure de base générée par R, on peut l'ouvrir avec Inkscape et ajouter à la main les éléments nécessaires. Dans l'exemple ci-dessous, j'ai ajoutée une légende qui explique comment interpréter les dimensions des rectangles représentant les villes:</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f6d657267696e672d7376672d722d6669677572652d64652d626173652d617665632d6c6567656e64652e737667/merging-svg-r-figure-de-base-avec-legende.svg" alt="Figure de base avec annotations ajoutées à la main" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/merging-svg-r-figure-de-base-avec-legende.svg"></p>
<p><em>Ajout manuel d'une légende avec Inkscape, en se basant sur la figure de base générée par R un peu plus tôt.</em></p>
<p>Une fois que la légende est complète, on efface tous les éléments qui avaient été créés par R afin de ne garder que les annotations ajoutées à la main. Ces annotations sont alors sauvegardées dans un nouveau fichier svg avec Inkscape (<code>annotations-manuelles.svg</code>, ci-dessous). Ce fichier peut être suivi par Git.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f6d657267696e672d7376672d722d6c6567656e64652e737667/merging-svg-r-legende.svg" alt="Fichier svg avec uniquement les annotations ajoutées à la main" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/merging-svg-r-legende.svg"><br>
<em>Fichier svg sauvegardé avec Inkscape, contenant uniquement les annotations manuelles.</em></p>
<p><strong>Une note importante :</strong> il est probable que la figure générée par R possède un rectangle blanc en arrière-plan. Il est important de bien penser à effacer cet arrière-plan avant d'enregistrer <code>annotations-manuelles.svg</code>, sinon il occultera la figure de base lorsque <code>annotations-manuelles.svg</code> sera superposé à la figure générée par R (voir ci-dessous).</p>
<h3 id="toc-3---automatisation-de-lajout-des-annotations-manuelles-à-la-figure-générée-par-r">3 - Automatisation de l'ajout des annotations manuelles à la figure générée par R</h3>
<p>À ce stade, on dispose de deux fichiers svg:</p>
<ul>
<li>Le fichier <code>figure-de-base.svg</code>, généré par le script R et facilement mis à jour si les données changent (il suffit d'exécuter le script R à nouveau avec les nouvelles données).</li>
<li>Le fichier <code>annotations-manuelles.svg</code>, créé à la main avec Inkscape et suivi par Git. Si les annotations doivent être modifiées dans le futur, elles le seront avec Inkscape et les modifications seront consignées dans l'historique de Git.</li>
</ul>
<p>La dernière étape consiste à réaliser l'incorporation du fichier <code>annotations-manuelles.svg</code> par-dessus <code>figure-de-base.svg</code> avec quelques lignes de code en R, de manière à ce que l'ensemble des opérations soient scriptées :</p>
<pre><code class="r"><span class="kn">library</span><span class="p">(</span>rsvg<span class="p">)</span>
<span class="kn">library</span><span class="p">(</span>grImport2<span class="p">)</span>
<span class="c1"># Conversion du fichier svg avec les annotations manuelles vers le format cairo</span>
<span class="c1"># svg reconnu par grImport2</span>
<span class="c1"># ("tmp-annotations-cairo.svg" est un fichier temporaire qui sera effacé)</span>
rsvg<span class="o">::</span>rsvg_svg<span class="p">(</span><span class="s">"annotations-manuelles.svg"</span><span class="p">,</span> <span class="s">"tmp-annotations-cairo.svg"</span><span class="p">)</span>
<span class="c1"># Chargement de la figure de base</span>
f_base <span class="o"><-</span> grImport2<span class="o">::</span>readPicture<span class="p">(</span><span class="s">"figure-de-base.svg"</span><span class="p">)</span>
<span class="c1"># Chargement des annotations (au format cairo svg)</span>
f_ann <span class="o"><-</span> grImport2<span class="o">::</span>readPicture<span class="p">(</span><span class="s">"tmp-annotations-cairo.svg"</span><span class="p">)</span>
<span class="c1"># Sauvegarde de la figure finale au format pdf par exemple</span>
cairo_pdf<span class="p">(</span><span class="s">"figure-finale.pdf"</span><span class="p">,</span> width <span class="o">=</span> <span class="m">8</span><span class="p">,</span> height <span class="o">=</span> <span class="m">5</span><span class="p">,</span> family <span class="o">=</span> <span class="s">"serif"</span><span class="p">)</span>
grImport2<span class="o">::</span>grid.picture<span class="p">(</span>f_base<span class="p">,</span> expansion <span class="o">=</span> <span class="m">0</span><span class="p">)</span>
grImport2<span class="o">::</span>grid.picture<span class="p">(</span>f_ann<span class="p">,</span> expansion <span class="o">=</span> <span class="m">0</span><span class="p">)</span>
dev.off<span class="p">()</span>
<span class="c1"># Nettoyage du fichier temporaire</span>
<span class="kp">file.remove</span><span class="p">(</span><span class="s">"tmp-annotations-cairo.svg"</span><span class="p">)</span></code></pre>
<p>Et voici la figure finale au format pdf :</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f6d657267696e672d7376672d722d6669677572652d66696e616c652e737667/merging-svg-r-figure-finale.svg" alt="Figure finale" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/merging-svg-r-figure-finale.svg"><br>
<em>Figure finale, avec à la fois la figure de base générée par R et les annotations manuelles créées via Inkscape.</em></p>
<p>À présent, si les données changent, on peut simplement exécuter à nouveau le script R qui produit la figure de base, puis le script R qui fusionne cette figure de base avec le fichier svg des annotations manuelles. Et si les annotations manuelles doivent être changées, on peut juste modifier le fichier svg des annotations à la main, le consigner dans l'historique de Git, et relancer le script R pour la fusion des fichiers graphiques !</p>
<h2 id="toc-conclusion">Conclusion</h2>
<p>R est un outil très souple et on peut faire énormément avec, y compris les légendes les plus tarabiscotées. Mais parfois il est indéniablement plus simple et plus rapide d'ouvrir Inkscape et de réaliser les annotations en quelques secondes plutôt qu'avec du code.</p>
<p>J'espère que ce journal aura permis de réconcilier les gens qui, comme moi, sont de fermes partisans de l'approche "100% codé en R pour être reproductible" avec l'idée d'ajouter quelques annotations à la main !</p>
<p>Et pour finir, quelques remarques :</p>
<ul>
<li>L'approche proposée ici marche très bien pour les annotations fixes, qui ne changent pas de place lorsque la figure est mise à jour, et qui sont simplement ajoutées à la figure. Par contre, cela ne sera pas une solution si un élément graphique produit par R doit être modifié ou supprimé : dans ce cas, il vaut mieux se donner un peu de mal avec R pour ne pas avoir à modifier cet élément en dehors du script, ou alors omettre son inclusion avec R et l'ajouter dans le fichier svg des annotations manuelles.</li>
<li>Je recommande de faire attention à être cohérent dans les dimensions des fichiers graphiques, c'est à dire de s'assurer que les fichiers svg en entrée (<code>figure-de-base.svg</code> et <code>annotations-manuelles.svg</code>) ainsi que le fichier final en sortie (<code>figure-finale.pdf</code>) aient la même taille, afin de ne pas avoir de mauvaise surprise quand les images sont superposées.</li>
</ul>
<p>Amusez-vous bien avec vos figures maintenant 100% reproductibles :)</p>
<div class="footnotes">
<hr>
<ol>
<li id="fn1">
<p>Voir par exemple Baker (2020) <a href="https://dx.doi.org/10.18637/jss.v094.c01">"Using GNU Make to Manage the Workflow of Data Analysis Projects"</a>. <a href="#fnref1">↩</a></p>
</li>
</ol>
</div>
<div><a href="https://linuxfr.org/users/pompoko/journaux/preparation-de-figures-avec-r-automatiser-l-ajout-d-annotations-manuelles.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/125453/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pompoko/journaux/preparation-de-figures-avec-r-automatiser-l-ajout-d-annotations-manuelles#comments">ouvrir dans le navigateur</a>
</p>
Matthieuhttps://linuxfr.org/nodes/125453/comments.atomtag:linuxfr.org,2005:Diary/397252021-04-21T13:20:48+02:002021-04-21T13:20:48+02:00Une brève introduction à l'utilisation des données OpenStreetMapLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-introduction">Introduction</a></li>
<li>
<a href="#toc-vue-densemble-de-l%C3%A9cosyst%C3%A8me-openstreetmap">Vue d'ensemble de l'écosystème OpenStreetMap</a><ul>
<li><a href="#toc-comment-t%C3%A9l%C3%A9charger-les-donn%C3%A9es-osm">Comment télécharger les données OSM</a></li>
<li><a href="#toc-structure-des-donn%C3%A9es-osm-brutes">Structure des données OSM brutes</a></li>
</ul>
</li>
<li>
<a href="#toc-un-exemple-visualiser-la-g%C3%A9ographie-du-danemark">Un exemple: visualiser la géographie du Danemark</a><ul>
<li><a href="#toc-t%C3%A9l%C3%A9charger-les-donn%C3%A9es">Télécharger les données</a></li>
<li>
<a href="#toc-extraire-les-donn%C3%A9es-cibles">Extraire les données cibles</a><ul>
<li><a href="#toc-p%C3%A9ninsule-du-jutland">Péninsule du Jutland</a></li>
<li><a href="#toc-r%C3%A9gion-de-copenhague">Région de Copenhague</a></li>
</ul>
</li>
<li><a href="#toc-dessiner-les-cartes">Dessiner les cartes</a></li>
</ul>
</li>
<li>
<a href="#toc-pour-aller-plus-loin">Pour aller plus loin</a><ul>
<li><a href="#toc-quelques-contenus-apparent%C3%A9s-%C3%A0-osm-d%C3%A9j%C3%A0-existants-sur-linuxfr">Quelques contenus apparentés à OSM déjà existants sur LinuxFr</a></li>
</ul>
</li>
<li><a href="#toc-conclusion">Conclusion</a></li>
</ul>
<h2 id="toc-introduction">Introduction</h2>
<p>Vous connaissez sans doute <a href="https://www.openstreetmap.org">OpenStreetMap</a> (ou OSM), une base de données géographiques libre et collaborative que chacun peut éditer, et qui a souvent été mentionnée sur LinuxFr (voir quelques liens rappelés en fin de journal). Si en théorie tout le monde peut réutiliser ces données (sous licence ouverte <a href="https://opendatacommons.org/licenses/odbl/">ODbl</a>), il peut être difficile pour un nouvel arrivant de savoir par où commencer pour y accéder.</p>
<p>Ce journal s'adresse aux personnes curieuses au sujet d'OpenStreetMap et intéressées par un usage simple des données OSM. Le but est de fournir une brève introduction à l'accès et à la visualisation de ces données cartographiques, mais avec assez d'informations pour aller plus loin une fois le sujet débroussaillé !</p>
<p>À titre d'exemple, ce journal présente les étapes et le code nécessaire pour réaliser quelques cartes du Danemark. Pour vous mettre en bouche, voici le genre d'image qui peut être générée en suivant ce journal, à partir de quelques lignes de commandes et d'un peu de <a href="https://www.r-project.org/">R</a> (le <a href="https://fr.wikipedia.org/wiki/R_(langage)">langage destiné aux statistiques</a>):</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f73742d706574657273626f7572672d7275737369652e6a7067/st-petersbourg-russie.jpg" alt="Carte de Saint-Pétersbourg réalisée à partir de données OSM" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/st-petersbourg-russie.jpg"></p>
<p><em>Vue de St-Pétersbourg (Russie) réalisée à partir des données OpenStreetMap. Seuls les éléments annotés <code>highways</code> sont utilisés dans cette figure, mais le Golfe de Finlande à l'ouest et le fleuve Néva qui traverse la ville sont bien visibles en filigrane.</em></p>
<h2 id="toc-vue-densemble-de-lécosystème-openstreetmap">Vue d'ensemble de l'écosystème OpenStreetMap</h2>
<p>La façon la plus directe de visualiser les données du projet OpenStreetMap est tout simplement de visiter son <a href="https://www.openstreetmap.org/">site</a>, qui permet de naviguer sur une carte du monde interactive. L'<a href="https://www.openstreetmap.org/help">aide</a> et le <a href="https://wiki.openstreetmap.org/wiki/FR:Page_principale">wiki</a> du projet sont plutôt bien faits et permettent de se jeter à l'eau facilement, par exemple pour <a href="https://wiki.openstreetmap.org/wiki/FR:Guide_du_d%C3%A9butant">contribuer soi-même à la cartographie</a>.</p>
<h3 id="toc-comment-télécharger-les-données-osm">Comment télécharger les données OSM</h3>
<p>L'accès aux données elles-mêmes peut sembler un peu plus intimidant: la base de données est <strong>très</strong> volumineuse (environ 100 Go pour la version compressée du monde entier en 2020), il existe de nombreux outils dédiés à différents aspects de la manipulation de ces données, et il peut être difficile de s'y retrouver au premier abord. Dans mon cas, je voulais pouvoir télécharger les données brutes de certaines régions pour générer mes propres visualisations cartographiques en amateur, mais j'ai longtemps eu l'impression que cela nécessitait des étapes ardues avec l'installation d'un serveur comme <a href="https://wiki.openstreetmap.org/wiki/Mapnik">mapnik</a> et d'une base de donnée comme <a href="https://wiki.openstreetmap.org/wiki/PostGIS">PostGIS</a>.</p>
<p>En réalité, il y a beaucoup de points d'entrée différents permettant d'utiliser les données brutes OSM ! Ces approches alternatives sont bien expliquées sur la <a href="https://wiki.openstreetmap.org/wiki/Downloading_data">page wiki correspondante</a>. Certaines API ou bibliothèques permettent de télécharger au coup par coup uniquement ce dont on a besoin (par exemple les <a href="https://wiki.openstreetmap.org/wiki/Overpass_API">instances de l'API Overpass</a> ou le <a href="https://cran.r-project.org/package=osmar">paquet R <code>osmar</code></a>). Je préfère pour ma part télécharger en une seule fois toutes les données correspondant à une certaine région, et travailler ensuite en local en me focalisant sur la mise au point de la visualisation graphique : c'est l'approche choisie dans ce journal.</p>
<p>Une manière pratique de télécharger les données pour une région cible est d'utiliser les instantanés de la base de données OSM fournis par <a href="https://www.geofabrik.de/">Geofabrik</a>. Dans quel format les données sont-elles proposées ? Il existe deux principaux formats utilisés (mais il y en a d'<a href="https://wiki.openstreetmap.org/wiki/Category:OSM_file_formats">autres</a>): le format <a href="https://wiki.openstreetmap.org/wiki/OSM_XML">OSM XML</a> (texte brut, organisé et clair) et le format <a href="https://wiki.openstreetmap.org/wiki/PBF_Format">PBF</a> (format binaire, compact, rapide à manipuler par les outils dédiés). Les fichiers peuvent facilement être convertis d'un format à l'autre si besoin.</p>
<p>Les fichiers de données OSM par régions ou par pays peuvent être très volumineux, en fonction de la taille du territoire couvert et de la quantité de données enregistrées pour ce territoire. Par exemple, à l'heure où j'écris ces lignes, le fichier PBF pour l'ensemble de la France fait 3,7 Go (mais des fichiers préparés par département sont disponibles), celui pour les Açores seulement 11.2 Mo et celui pour les USA 7,3 Go.</p>
<h3 id="toc-structure-des-données-osm-brutes">Structure des données OSM brutes</h3>
<p>Les données OSM sont vectorielles : il s'agit d'entités géométriques comme des points, des lignes, ou des polygones, que des moteurs de rendu peuvent utiliser pour générer des tuiles de carte à différent niveaux de zoom. </p>
<p>D'un point de vue technique, les données OSM brutes sont ainsi constituées d'<a href="https://wiki.openstreetmap.org/wiki/FR:%C3%89l%C3%A9ments">éléments fondamentaux</a> qui peuvent être:</p>
<ul>
<li>un <strong>nœud</strong> (<code>node</code>), l'élément de base muni d'une latitude et d'une longitude. Il peut être utilisé pour décrire des objets ponctuels (comme un arrêt de bus, un arbre ou un feu tricolore) ou comme composant d'un élément plus complexe.</li>
<li>un <strong>chemin</strong> (<code>way</code>), formé par plusieurs nœuds connectés en une ligne ouverte (ex : route) ou en un polygone fermé (ex : lac).</li>
<li>une <strong>relation</strong> (<code>relation</code>), qui permet d'associer entre eux plusieurs éléments. Par exemple, plusieurs chemins peuvent être groupés en une voie cyclable continue.</li>
</ul>
<p>Ces éléments (nœuds, chemins, relations) sont complétés par un système d'<a href="https://wiki.openstreetmap.org/wiki/FR:Attributs">attributs</a> (<code>tags</code>) de la forme <code>key=value</code>. Par exemple, un chemin avec l'attribut <code>highway=motorway</code> représente une route, et pourrait également être muni d'un attribut comme <code>maxspeed=80</code>.</p>
<p>Une fois familiarisé avec cette hiérarchie relativement simple, vous pourrez jongler avec les données brutes et extraire celles qui vous intéressent sans trop de difficulté, en particulier si vous êtes un peu habitué à manipuler des tableaux de données avec R, Python ou SQL par exemple. Cependant, une chose importante à retenir est que les attributs ne sont pas toujours parfaitement enregistrés par les contributeurs ! Par exemple, certains contributeurs peuvent avoir annoté un trait de côte avec l'attribut <code>coastline</code>, d'autres avec <code>Coastline</code>. Un cours d'eau peut avoir été annoté en tant que <code>natural=water</code>, mais l'attribut <code>water=river</code> peut avoir été oublié.</p>
<h2 id="toc-un-exemple-visualiser-la-géographie-du-danemark">Un exemple: visualiser la géographie du Danemark</h2>
<p>L'approche simple présentée ici pour générer une carte se découpe en trois étapes :</p>
<ol>
<li>
<strong>télécharger</strong> les données de la région d'intérêt (ici le Danemark) au format PBF</li>
<li>
<strong>extraire</strong> du fichier PBF les données requises pour la carte que l'on veut dessiner, au format XML. Ce filtrage peut être fait en fonction de coordonnées géographiques définissant une zone à extraire et/ou du type de données recherchées (par exemple extraire uniquement les traits de côte et les cours d'eau).</li>
<li>
<strong>dessiner</strong> la carte en utilisant R et quelques paquets dédiés.</li>
</ol>
<h3 id="toc-télécharger-les-données">Télécharger les données</h3>
<p>Pour l'exemple choisi dans ce journal (le Danemark), nous pouvons trouver les données OSM brutes à partir de la <a href="https://download.geofabrik.de/">page de téléchargement</a> de Geofabrik. Une fois arrivés sur la <a href="https://download.geofabrik.de/europe/denmark.html">page pour le Danemark</a>, on nous propose les données sous différents formats, y compris au format PBF qui nous intéresse ici (fichier <a href="https://download.geofabrik.de/europe/denmark-latest.osm.pbf">denmark-latest.osm.pbf</a>, 373 Mo).</p>
<p>La ligne de commande ci-dessous permet de télécharger le fichier PBF requis en utilisant <code>wget</code>:</p>
<pre><code class="bash"><span class="c1"># Télécharge le fichier denmark-latest.osm.pbf dans le répertoire courant</span>
wget https://download.geofabrik.de/europe/denmark-latest.osm.pbf</code></pre>
<h3 id="toc-extraire-les-données-cibles">Extraire les données cibles</h3>
<p>La taille du fichier PBF téléchargé est relativement raisonnable (373 Mo), ce qui est une des raisons du choix du Danemark pour cet exemple. Une fois converties au format XML, les données pour le Danemark entier sont tout de même assez lourdes et la manipulation du jeu complet dans une session R serait un peu malaisée, d'où l'intérêt d'utiliser des outils en ligne de commande pour affiner le jeu de données directement à partir du fichier PBF.</p>
<p>Le programme <a href="https://osmcode.org/osmium-tool/"><code>osmium</code></a> est un outil en ligne de commande qui permet de manipuler efficacement les fichiers PBF. (Plus généralement, <a href="https://wiki.openstreetmap.org/wiki/Osmium">Osmium</a> est aussi une bibliothèque C++ avec des interfaces Python et NodeJS disponibles.) Sur un système Debian, on peut l'installer depuis les dépôts avec <code>apt install osmium-tool</code>. Si la région d'intérêt est connue (par exemple une ville en particulier), il est avantageux d'utiliser <code>osmium</code> pour extraire uniquement les données comprises dans un cadre de latitude et longitude données (une "bounding box" en anglais). De plus, <code>osmium</code> est aussi capable de filtrer les données en se basant sur les attributs.</p>
<p>J'utilise personnellement <a href="https://marble.kde.org/">Marble</a> pour trouver facilement les limites en latitude et longitude de ma zone d'intérêt. Pour cet exemple, je m'intéresse à deux zones du Danemark et je vais donc extraire deux fichiers PBF à partir du fichier PBF du Danemark métropolitain complet :</p>
<ol>
<li>un fichier centré sur le nord de la <a href="https://fr.wikipedia.org/wiki/Jutland">péninsule du Jutland</a>. Il sera ensuite filtré par attributs pour garder uniquement les traits de côte ainsi que les rivières et autres éléments hydrographiques. Le cadre géographique est défini par une longitude comprise entre 8 et 11°E et une latitude comprise entre 56 et 58°N.</li>
<li>un fichier centré sur Copenhague. Il sera ensuite filtré par attributs pour garder uniquement les traits de côte et l'hydrographie ainsi que les routes. Le cadre géographique est défini par une longitude comprise entre 12 et 13°E et une latitude comprise entre 55.5 et 56°N.</li>
</ol>
<h4 id="toc-péninsule-du-jutland">Péninsule du Jutland</h4>
<p>Voici les lignes de commande utilisées pour extraire les données de la péninsule du Jutland :</p>
<pre><code class="bash"><span class="c1"># Extraire les données pour la région du Jutland</span>
osmium extract --bbox <span class="m">8</span>,56,11,58 -s smart denmark-latest.osm.pbf -o jutland.pbf
<span class="c1"># Filtrer les traits de côte, rivières et autres plans d'eau via les attributs</span>
osmium tags-filter jutland.pbf wr/natural<span class="o">=</span>water wr/natural<span class="o">=</span>bay wr/natural<span class="o">=</span>coastline wr/natural<span class="o">=</span>Coastline wr/water wr/waterway -o jutland-cotes.xml</code></pre>
<p>La commande <code>osmium extract</code> ci-dessus utilise l'option <code>--bbox</code> pour définir le cadre en longitude et latitude et l'option <code>-s smart</code> pour éviter de tronquer les polygones qui chevaucheraient le cadre défini par <code>--bbox</code> (<a href="https://osmcode.org/osmium-tool/manual.html#creating-geographic-extracts">page du manuel</a>).</p>
<p>La commande <code>osmium tags-filter</code> est utilisée pour extraire uniquement les éléments qui nous intéressent (et les convertir au format XML en passant) (<a href="https://osmcode.org/osmium-tool/manual.html#filtering-by-tags">page du manuel</a>). Ici, je requiers tous les éléments <code>ways</code> ou <code>relations</code> (préfixe <code>wr/</code> dans la ligne de commande) avec un attribut <code>natural</code> égal à <code>water</code>, <code>bay</code>, <code>coastline</code> ou <code>Coastline</code> ou avec un attribut <code>water</code> ou <code>waterway</code>. Cela devrait correspondre plus ou moins aux côtes, rivières et plans d'eau, mais encore une fois l'annotation des attributs n'est pas forcément parfaite. Pour cette raison, il est parfois utile d'examiner systématiquement tous les attributs des éléments couvrant la région d'intérêt pour déterminer ceux qui nous intéressent (en utilisant un peu de <code>grep</code>, <code>sort</code> et <code>uniq</code> sur le fichier XML non-filtré de la région, par exemple). L'outil <a href="https://taginfo.openstreetmap.org/">taginfo</a> d'OpenStreetMap peut être utile (voir aussi la page du <a href="https://wiki.openstreetmap.org/wiki/Tags%5D">wiki</a> consacrée aux attributs).</p>
<p>À ce stade, le fichier <code>jutland-cotes.xml</code> contient les données qui nous intéressent pour la visualisation. C'est ce fichier que nous allons pouvoir charger dans R pour dessiner la carte.</p>
<h4 id="toc-région-de-copenhague">Région de Copenhague</h4>
<p>Concernant la seconde zone géographique de notre exemple, voici les lignes de commandes utilisées pour extraire les traits de côte et les routes autour de Copenhague :</p>
<pre><code class="bash"><span class="c1"># Extraire les données pour la région de Copenhague</span>
osmium extract --bbox <span class="m">12</span>,55.5,13,56 -s smart denmark-latest.osm.pbf -o copenhague.pbf
<span class="c1"># Filtrer les traits de côte, rivières et plans d'eau</span>
osmium tags-filter copenhague.pbf wr/natural<span class="o">=</span>water wr/natural<span class="o">=</span>bay wr/natural<span class="o">=</span>coastline wr/natural<span class="o">=</span>Coastline wr/water wr/waterway -o copenhague-cotes.xml
<span class="c1"># Filter les routes</span>
osmium tags-filter copenhague.pbf w/highway -o copenhague-routes.xml</code></pre>
<p>À ce stade, deux fichiers sont prêts pour Copenhague : <code>copenhague-cotes.xml</code> et <code>copenhague-routes.xml</code>.</p>
<h3 id="toc-dessiner-les-cartes">Dessiner les cartes</h3>
<p>Une fois que les fichiers XML contenant les données nécessaires à la préparation des cartes sont prêts, il ne reste plus qu'à les charger dans R (ou le programme graphique de votre choix), à jongler un peu pour récupérer les latitudes et longitudes de chaque point et à dessiner le tout dans un fichier png.</p>
<p>C'est donc R qui est employé ici : il s'agit d'un langage de programmation et d'un logiciel libre très utilisé pour les statistiques, aussi bien dans le monde de la recherche académique que dans celui des entreprises privées. Une introduction à R est en dehors du cadre de ce journal, mais quelques pointeurs sont fournis dans la section <strong>Pour aller plus loin</strong> si vous êtes intéressé !</p>
<p>Les paquets R utilisés ci-dessous sont <code>osmar</code> pour le chargement des données OSM, <code>tidyverse</code> pour la manipulation des données, et <code>ggplot2</code> et <code>cowplot</code> pour la partie graphique. Notez qu'<code>osmar</code> nécessite l'installation d'un programme tiers, <code>osmosis</code>, qui peut être installé sur un système Debian avec <code>apt install osmosis</code>.</p>
<p>Voici le code R nécessaire pour dessiner une carte des côtes du Jutland :</p>
<pre><code class="r"><span class="c1"># Chargement des paquets</span>
<span class="kn">library</span><span class="p">(</span>osmar<span class="p">)</span>
<span class="kn">library</span><span class="p">(</span>tidyverse<span class="p">)</span> <span class="c1"># cela charge aussi ggplot2</span>
<span class="kn">library</span><span class="p">(</span>cowplot<span class="p">)</span>
<span class="c1"># Chargement des données OSM</span>
src <span class="o"><-</span> osmsource_osmosis<span class="p">(</span><span class="s">"jutland-cotes.xml"</span><span class="p">)</span>
bbox <span class="o"><-</span> corner_bbox<span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">50</span><span class="p">,</span> <span class="m">20</span><span class="p">,</span> <span class="m">65</span><span class="p">)</span>
jutland <span class="o"><-</span> get_osm<span class="p">(</span>bbox<span class="p">,</span> src<span class="p">)</span>
<span class="c1"># Quelle est la structure de l'object `jutland` ?</span>
str<span class="p">(</span>jutland<span class="p">)</span></code></pre>
<p>L'objet <code>jutland</code> est une liste qui contient les infos sur les nœuds (<code>jutland$nodes</code>), les chemins (<code>jutland$ways</code>) et les relations (<code>jutland$relations</code>). Le code ci-dessous manipule ces données pour obtenir un tableau final propre, avec les coordonnées de tous les points définissant des chemins ayant un attribut <code>natural</code>, <code>water</code> ou <code>waterway</code> :</p>
<pre><code class="r">target_ways_id <span class="o"><-</span> jutland<span class="o">$</span>ways<span class="o">$</span>tags <span class="o">%>%</span>
filter<span class="p">(</span>k <span class="o">==</span> <span class="s">"natural"</span> <span class="o">|</span> k <span class="o">==</span> <span class="s">"water"</span> <span class="o">|</span> k <span class="o">==</span> <span class="s">"waterway"</span><span class="p">)</span> <span class="o">%>%</span>
pull<span class="p">(</span>id<span class="p">)</span> <span class="o">%>%</span> <span class="kp">unique</span><span class="p">()</span>
target_refs <span class="o"><-</span> jutland<span class="o">$</span>ways<span class="o">$</span>refs <span class="o">%>%</span> filter<span class="p">(</span>id <span class="o">%in%</span> target_ways_id<span class="p">)</span>
target_nodes <span class="o"><-</span> left_join<span class="p">(</span>target_refs<span class="p">,</span> jutland<span class="o">$</span>nodes<span class="o">$</span>attrs<span class="p">,</span> by <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="s">"ref"</span> <span class="o">=</span> <span class="s">"id"</span><span class="p">))</span></code></pre>
<p>Maintenant que le tableau <code>target_nodes</code> contient tous les nœuds intéressants, groupés par l'identifiant du chemin auquel ils appartiennent, nous sommes prêts à utiliser <code>ggplot2</code> pour tracer la carte :</p>
<pre><code class="r">bkg_col <span class="o"><-</span> grey<span class="p">(</span><span class="m">0.1</span><span class="p">)</span>
p <span class="o"><-</span> ggplot<span class="p">(</span>target_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">))</span> <span class="o">+</span>
geom_path<span class="p">(</span>aes<span class="p">(</span>group <span class="o">=</span> id<span class="p">),</span> col <span class="o">=</span> <span class="s">"chartreuse"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">0.3</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">(</span>xlim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">8</span><span class="p">,</span> <span class="m">11.5</span><span class="p">),</span> ylim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">56.4</span><span class="p">,</span> <span class="m">58</span><span class="p">))</span> <span class="o">+</span>
theme_void<span class="p">()</span> <span class="o">+</span>
theme<span class="p">(</span>plot.background <span class="o">=</span> element_rect<span class="p">(</span>fill <span class="o">=</span> bkg_col<span class="p">,</span> colour <span class="o">=</span> bkg_col<span class="p">))</span>
p <span class="o"><-</span> cowplot<span class="o">::</span>ggdraw<span class="p">(</span>p<span class="p">)</span> <span class="o">+</span> theme<span class="p">(</span>plot.background <span class="o">=</span> element_rect<span class="p">(</span>fill <span class="o">=</span> bkg_col<span class="p">))</span>
ggsave<span class="p">(</span><span class="s">"jutland.png"</span><span class="p">,</span> p<span class="p">,</span> width <span class="o">=</span> <span class="m">12</span><span class="p">,</span> height <span class="o">=</span> <span class="m">6.75</span><span class="p">)</span></code></pre>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f6a75746c616e642e6a7067/jutland.jpg" alt="Carte du Jutland réalisée à partir de données OSM" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/jutland.jpg"><br>
<em>Vue du nord de la péninsule du Jutland (Danemark). Le centre de la carte est à peu près localisé à 9.8°E, 57.3°N, et la hauteur totale nord-sud de la zone représentée est d'environ 200 km.</em></p>
<p>On peut jouer sur les couleurs pour différents styles de rendu :</p>
<pre><code class="r">bkg_col <span class="o"><-</span> <span class="s">"dodgerblue3"</span>
p <span class="o"><-</span> ggplot<span class="p">(</span>target_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">))</span> <span class="o">+</span>
geom_path<span class="p">(</span>aes<span class="p">(</span>group <span class="o">=</span> id<span class="p">),</span> col <span class="o">=</span> <span class="s">"white"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">0.5</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">(</span>xlim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">8</span><span class="p">,</span> <span class="m">11.5</span><span class="p">),</span> ylim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">56.4</span><span class="p">,</span> <span class="m">58</span><span class="p">))</span> <span class="o">+</span>
theme_void<span class="p">()</span> <span class="o">+</span>
theme<span class="p">(</span>plot.background <span class="o">=</span> element_rect<span class="p">(</span>fill <span class="o">=</span> bkg_col<span class="p">,</span> colour <span class="o">=</span> bkg_col<span class="p">))</span>
p <span class="o"><-</span> cowplot<span class="o">::</span>ggdraw<span class="p">(</span>p<span class="p">)</span> <span class="o">+</span> theme<span class="p">(</span>plot.background <span class="o">=</span> element_rect<span class="p">(</span>fill <span class="o">=</span> bkg_col<span class="p">))</span>
ggsave<span class="p">(</span><span class="s">"jutland-bleu.png"</span><span class="p">,</span> p<span class="p">,</span> width <span class="o">=</span> <span class="m">12</span><span class="p">,</span> height <span class="o">=</span> <span class="m">6.75</span><span class="p">)</span></code></pre>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f6a75746c616e642d626c65752e6a7067/jutland-bleu.jpg" alt="Carte du Jutland réalisée à partir de données OSM, style diazographie" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/jutland-bleu.jpg"><br>
<em>Même vue que précédemment, style <a href="https://fr.wikipedia.org/wiki/Diazographie">diazographie</a>.</em></p>
<p>Pour la seconde partie de notre exemple, Copenhague, le principe est le même. La seule différence est que l'on charge séparément les données pour les côtes et pour les routes avant de les afficher ensemble sur la carte finale :</p>
<pre><code class="r"><span class="c1"># Chargement des données OSM (cela prend un moment)</span>
src <span class="o"><-</span> osmsource_osmosis<span class="p">(</span><span class="s">"copenhague-cotes.xml"</span><span class="p">)</span>
cophg_cotes <span class="o"><-</span> get_osm<span class="p">(</span>bbox<span class="p">,</span> src<span class="p">)</span>
src <span class="o"><-</span> osmsource_osmosis<span class="p">(</span><span class="s">"copenhague-routes.xml"</span><span class="p">)</span>
cophg_routes <span class="o"><-</span> get_osm<span class="p">(</span>bbox<span class="p">,</span> src<span class="p">)</span>
<span class="c1"># Préparation des données pour les côtes et l'hydrographie</span>
target_ways_id <span class="o"><-</span> cophg_cotes<span class="o">$</span>ways<span class="o">$</span>tags <span class="o">%>%</span>
filter<span class="p">(</span>k <span class="o">==</span> <span class="s">"natural"</span> <span class="o">|</span> k <span class="o">==</span> <span class="s">"water"</span> <span class="o">|</span> k <span class="o">==</span> <span class="s">"waterway"</span><span class="p">)</span> <span class="o">%>%</span>
pull<span class="p">(</span>id<span class="p">)</span> <span class="o">%>%</span> <span class="kp">unique</span><span class="p">()</span>
target_refs <span class="o"><-</span> cophg_cotes<span class="o">$</span>ways<span class="o">$</span>refs <span class="o">%>%</span> filter<span class="p">(</span>id <span class="o">%in%</span> target_ways_id<span class="p">)</span>
coast_nodes <span class="o"><-</span> left_join<span class="p">(</span>target_refs<span class="p">,</span> cophg_cotes<span class="o">$</span>nodes<span class="o">$</span>attrs<span class="p">,</span> by <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="s">"ref"</span> <span class="o">=</span> <span class="s">"id"</span><span class="p">))</span>
<span class="c1"># Préparation des données pour les routes</span>
target_ways_id <span class="o"><-</span> cophg_routes<span class="o">$</span>ways<span class="o">$</span>tags <span class="o">%>%</span> filter<span class="p">(</span>k <span class="o">==</span> <span class="s">"highway"</span><span class="p">)</span> <span class="o">%>%</span>
pull<span class="p">(</span>id<span class="p">)</span> <span class="o">%>%</span> <span class="kp">unique</span><span class="p">()</span>
target_refs <span class="o"><-</span> cophg_routes<span class="o">$</span>ways<span class="o">$</span>refs <span class="o">%>%</span> filter<span class="p">(</span>id <span class="o">%in%</span> target_ways_id<span class="p">)</span>
road_nodes <span class="o"><-</span> left_join<span class="p">(</span>target_refs<span class="p">,</span> cophg_routes<span class="o">$</span>nodes<span class="o">$</span>attrs<span class="p">,</span> by <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="s">"ref"</span> <span class="o">=</span> <span class="s">"id"</span><span class="p">))</span></code></pre>
<p>À ce stade les tableaux <code>coast_nodes</code> et <code>road_nodes</code> contiennent les données propres, prêtes à être dessinées :</p>
<pre><code class="r"><span class="c1"># Le code ci-dessous trace deux fois les routes, avec la même couleur mais avec</span>
<span class="c1"># des largeurs et des transparences un peu différentes, afin de leur donner un</span>
<span class="c1"># léger effet de lueur.</span>
bkg_col <span class="o"><-</span> grey<span class="p">(</span><span class="m">0.1</span><span class="p">)</span>
p <span class="o"><-</span> ggplot<span class="p">(</span>coast_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">))</span> <span class="o">+</span>
geom_path<span class="p">(</span>data <span class="o">=</span> road_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">,</span> group <span class="o">=</span> id<span class="p">),</span>
col <span class="o">=</span> adjustcolor<span class="p">(</span><span class="s">"magenta"</span><span class="p">,</span> alpha.f <span class="o">=</span> <span class="m">0.12</span><span class="p">),</span> size <span class="o">=</span> <span class="m">0.5</span><span class="p">)</span> <span class="o">+</span>
geom_path<span class="p">(</span>data <span class="o">=</span> road_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">,</span> group <span class="o">=</span> id<span class="p">),</span>
col <span class="o">=</span> <span class="s">"magenta"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">0.1</span><span class="p">)</span> <span class="o">+</span>
geom_path<span class="p">(</span>aes<span class="p">(</span>group <span class="o">=</span> id<span class="p">),</span> col <span class="o">=</span> <span class="s">"deepskyblue"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">0.2</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">(</span>xlim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">12.05</span><span class="p">,</span> <span class="m">12.9</span><span class="p">),</span> ylim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">55.52</span><span class="p">,</span> <span class="m">55.79</span><span class="p">))</span> <span class="o">+</span>
theme_void<span class="p">()</span> <span class="o">+</span>
theme<span class="p">(</span>plot.background <span class="o">=</span> element_rect<span class="p">(</span>fill <span class="o">=</span> bkg_col<span class="p">,</span> colour <span class="o">=</span> bkg_col<span class="p">))</span>
p <span class="o"><-</span> cowplot<span class="o">::</span>ggdraw<span class="p">(</span>p<span class="p">)</span> <span class="o">+</span> theme<span class="p">(</span>plot.background <span class="o">=</span> element_rect<span class="p">(</span>fill <span class="o">=</span> bkg_col<span class="p">))</span>
ggsave<span class="p">(</span><span class="s">"copenhague.png"</span><span class="p">,</span> p<span class="p">,</span> width <span class="o">=</span> <span class="m">12</span><span class="p">,</span> height <span class="o">=</span> <span class="m">6.75</span><span class="p">)</span></code></pre>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f636f70656e68616775652e6a7067/copenhague.jpg" alt="Carte de Copenhague réalisée à partir de données OSM" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/copenhague.jpg"><br>
<em>Vue de Copenhague (Danemark). Côtes et réseau hydrographique en bleu, routes en magenta. La largeur totale de la zone représentée est d'environ 60 km.</em></p>
<p>En utilisant des limites en x et y plus étroites dans la fonction <code>coord_map()</code>, on peut zoomer sur une partie de la ville :</p>
<pre><code class="r">p <span class="o"><-</span> ggplot<span class="p">(</span>coast_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">))</span> <span class="o">+</span>
geom_path<span class="p">(</span>data <span class="o">=</span> road_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">,</span> group <span class="o">=</span> id<span class="p">),</span>
col <span class="o">=</span> adjustcolor<span class="p">(</span><span class="s">"magenta"</span><span class="p">,</span> alpha.f <span class="o">=</span> <span class="m">0.1</span><span class="p">),</span> size <span class="o">=</span> <span class="m">1</span><span class="p">)</span> <span class="o">+</span>
geom_path<span class="p">(</span>data <span class="o">=</span> road_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">,</span> group <span class="o">=</span> id<span class="p">),</span>
col <span class="o">=</span> adjustcolor<span class="p">(</span><span class="s">"magenta"</span><span class="p">,</span> alpha.f <span class="o">=</span> <span class="m">0.1</span><span class="p">),</span> size <span class="o">=</span> <span class="m">0.6</span><span class="p">)</span> <span class="o">+</span>
geom_path<span class="p">(</span>data <span class="o">=</span> road_nodes<span class="p">,</span> aes<span class="p">(</span>x <span class="o">=</span> lon<span class="p">,</span> y <span class="o">=</span> lat<span class="p">,</span> group <span class="o">=</span> id<span class="p">),</span>
col <span class="o">=</span> <span class="s">"magenta"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">0.2</span><span class="p">)</span> <span class="o">+</span>
geom_path<span class="p">(</span>aes<span class="p">(</span>group <span class="o">=</span> id<span class="p">),</span> col <span class="o">=</span> <span class="s">"deepskyblue"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">0.4</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">(</span>xlim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">12.5</span><span class="p">,</span> <span class="m">12.7</span><span class="p">),</span> ylim <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">55.642</span><span class="p">,</span> <span class="m">55.705</span><span class="p">))</span> <span class="o">+</span>
theme_void<span class="p">()</span> <span class="o">+</span>
theme<span class="p">(</span>plot.background <span class="o">=</span> element_rect<span class="p">(</span>fill <span class="o">=</span> bkg_col<span class="p">,</span> colour <span class="o">=</span> bkg_col<span class="p">))</span>
p <span class="o"><-</span> cowplot<span class="o">::</span>ggdraw<span class="p">(</span>p<span class="p">)</span> <span class="o">+</span> theme<span class="p">(</span>plot.background <span class="o">=</span> element_rect<span class="p">(</span>fill <span class="o">=</span> bkg_col<span class="p">))</span>
ggsave<span class="p">(</span><span class="s">"copenhague-zoom.png"</span><span class="p">,</span> p<span class="p">,</span> width <span class="o">=</span> <span class="m">12</span><span class="p">,</span> height <span class="o">=</span> <span class="m">6.75</span><span class="p">)</span></code></pre>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6d617474686965752d6272756e656175782e6769746c61622e696f2f696d616765732d6c696e757866722f696d616765732f636f70656e68616775652d7a6f6f6d2e6a7067/copenhague-zoom.jpg" alt="Carte de Copenhague réalisée à partir de données OSM (zoomée)" title="Source : https://matthieu-bruneaux.gitlab.io/images-linuxfr/images/copenhague-zoom.jpg"><br>
<em>Vue agrandie de Copenhague (Danemark). La largeur de la zone représentée est d'environ 14 km.</em></p>
<h2 id="toc-pour-aller-plus-loin">Pour aller plus loin</h2>
<ul>
<li><a href="https://wiki.openstreetmap.org/wiki/Main_Page">le wiki d'OpenStreetMap</a></li>
<li>
<a href="https://wiki.openstreetmap.org/wiki/Osmium">osmium</a> pour manipuler les fichiers de données OSM</li>
<li>
<a href="https://wiki.openstreetmap.org/wiki/OSMCoastline">osmcoastline</a> pour extraire des traits de côte propres</li>
<li>l'excellent livre <a href="https://r4ds.had.co.nz/">R for Data Science</a> par H. Wickham et G. Grolemund. Si vous ne devez lire qu'un seul livre pour vous mettre le pied à l'étrier avec R, je recommande celui-là.</li>
<li>le <a href="https://journal.r-project.org/archive/2013/RJ-2013-005/index.html">papier par Eugster et Schlesinger</a> décrivant le paquet R <code>osmar</code> est une bonne introduction à l'utilisation des données OSM dans R.</li>
</ul>
<h3 id="toc-quelques-contenus-apparentés-à-osm-déjà-existants-sur-linuxfr">Quelques contenus apparentés à OSM déjà existants sur LinuxFr</h3>
<ul>
<li>Une dépêche par PhRæD (12/2020) : <a href="//linuxfr.org/news/contribuer-a-openstreetmap-avec-l-editeur-id">Contribuer à OpenStreetMap avec l'éditeur iD</a>
</li>
<li>Un journal par gUI (11/2020) : <a href="//linuxfr.org/users/gbetous/journaux/servir-ses-propres-tuiles-osm">Servir ses propres tuiles OSM</a>
</li>
<li>Un lien par Colargol (10/2020) : <a href="//linuxfr.org/users/colargol/liens/osmdata-visualiser-et-telecharger-les-donnees-d-osm">OSMdata : visualiser et télécharger les données d'OSM !</a>
</li>
</ul>
<p><em>Avant 2015</em></p>
<ul>
<li>Un journal par jben (10/2014) : <a href="//linuxfr.org/users/jben/journaux/rv-herve-recherche-d-itineraire-velo-minimisant-l-energie-en-utilisant-les-donnees-d-osm">rv/hervé : recherche d'itinéraire vélo minimisant l'énergie en utilisant les données d'OSM</a>
</li>
<li>Une dépêche par JohannCR (06/2013) : <a href="//linuxfr.org/news/comment-creer-une-carte-open-street-map">Comment créer une carte Open Street Map</a>
</li>
<li>Une dépêche par Alexis de Lattre (05/2013) : <a href="//linuxfr.org/news/openstreetmap-pourquoi-vous-devriez-l-utiliser">OpenStreetMap : pourquoi vous devriez l'utiliser</a>
</li>
<li>Un journal par Jaimé Ragnagna (04/2012) : <a href="//linuxfr.org/users/ragnagna/journaux/openstreetmap-au-dela-des-donnees-le-rendu-visuel">OpenStreetMap - Au dela des données : le rendu visuel</a>
</li>
<li>Un journal (le premier au sujet d'OSM sur LinuxFr ?) par Wawet76 (05/2006) : <a href="//linuxfr.org/users/wawet76/journaux/cartographie-libre">Cartographie Libre</a>
</li>
</ul>
<h2 id="toc-conclusion">Conclusion</h2>
<p>J'espère que ce journal aura permis de démystifier un peu l'accès aux données brutes OSM et leur utilisation en amateur. De belles cartes n'attendent que quelques lignes de code pour jaillir de votre imagination :)</p>
<div><a href="https://linuxfr.org/users/pompoko/journaux/une-breve-introduction-a-l-utilisation-des-donnees-openstreetmap.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/124040/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pompoko/journaux/une-breve-introduction-a-l-utilisation-des-donnees-openstreetmap#comments">ouvrir dans le navigateur</a>
</p>
Matthieuhttps://linuxfr.org/nodes/124040/comments.atomtag:linuxfr.org,2005:Bookmark/22202020-11-05T13:35:38+01:002020-11-05T13:35:38+01:00Microsoft R Open: The Enhanced R Distribution<a href="https://mran.microsoft.com/rro">https://mran.microsoft.com/rro</a> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/122123/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/flavien/liens/microsoft-r-open-the-enhanced-r-distribution#comments">ouvrir dans le navigateur</a>
</p>
Flavienhttps://linuxfr.org/nodes/122123/comments.atomtag:linuxfr.org,2005:Diary/391122020-04-27T14:23:25+02:002020-04-28T09:28:40+02:00Gnu R version 4.0.0 est disponibleLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>R est un langage de programmation et un logiciel libre destiné aux statistiques et à la science des données. La version 4.0.0 est sorti le 24 avril </p>
<p>La liste complète des changements est disponible ici : <a href="https://cran.r-project.org/doc/manuals/r-release/NEWS.html">https://cran.r-project.org/doc/manuals/r-release/NEWS.html</a>.</p>
<p>Une des évolutions est potentiellement relativement impactante sur les scripts existants. Dans les versions précédentes, les chaînes de caractères étaient par défaut transformées en <strong>factor</strong> dans les fonctions <strong>read.table</strong> et <strong>data.frame</strong> (paramètre par défaut StringsAsFactor=TRUE), ce n'est plus le cas dans la version 4.0.0, les chaînes restent des chaînes.</p>
<pre><code class="R"><span class="c1">#version 3.5</span>
dta<span class="o"><-</span><span class="kt">data.frame</span><span class="p">(</span>id<span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">3</span><span class="p">,</span> car<span class="o">=</span><span class="kc">LETTERS</span><span class="p">[</span><span class="m">1</span><span class="o">:</span><span class="m">3</span><span class="p">])</span>
str<span class="p">(</span>dta<span class="p">)</span>
<span class="s">'data.frame'</span><span class="o">:</span> <span class="m">3</span> obs. of <span class="m">2</span> variables<span class="o">:</span>
<span class="o">$</span> id <span class="o">:</span> int <span class="m">1</span> <span class="m">2</span> <span class="m">3</span>
<span class="o">$</span> car<span class="o">:</span> Factor w<span class="o">/</span> <span class="m">3</span> levels <span class="s">"A"</span><span class="p">,</span><span class="s">"B"</span><span class="p">,</span><span class="s">"C"</span><span class="o">:</span> <span class="m">1</span> <span class="m">2</span> <span class="m">3</span>
<span class="c1">#version 4.0</span>
dta<span class="o"><-</span><span class="kt">data.frame</span><span class="p">(</span>id<span class="o">=</span><span class="m">1</span><span class="o">:</span><span class="m">3</span><span class="p">,</span> car<span class="o">=</span><span class="kc">LETTERS</span><span class="p">[</span><span class="m">1</span><span class="o">:</span><span class="m">3</span><span class="p">])</span>
str<span class="p">(</span>dta<span class="p">)</span>
<span class="s">'data.frame'</span><span class="o">:</span> <span class="m">3</span> obs. of <span class="m">2</span> variables<span class="o">:</span>
<span class="o">$</span> id <span class="o">:</span> int <span class="m">1</span> <span class="m">2</span> <span class="m">3</span>
<span class="o">$</span> car<span class="o">:</span> chr <span class="s">"A"</span> <span class="s">"B"</span> <span class="s">"C"</span></code></pre>
<p>Personnellement, je préfére le nouveau comportement, je commençais régulièrement mes scripts par la commande :</p>
<pre><code class="R"><span class="kp">options</span><span class="p">(</span>stringsAsFactors <span class="o">=</span> <span class="kc">FALSE</span><span class="p">)</span></code></pre>
<p>Ce qui n'est donc plus nécessaire.</p>
<p>Concernant la mise à jour. Sur Debian, pour ceux qui comme moi n'utilise pas la version de la distribution mais celle du cran, il est nécessaire de modifier le fichier sources.list</p>
<pre><code>#la ligne
deb http://mon_miroir_cran/bin/linux/debian buster-cran35/
#doit être remplacé par
deb http://mon_miroir_cran/bin/linux/debian buster-cran40
</code></pre>
<p>puis le classique apt update & apt upgrade</p>
<p>Une fois la mise à jour effectuée, il est nécessaire de réinstaller la totalité des packages (Cette réinstallation est nécessaire pour tous les OS)</p>
<p>Ce qui peut être réalisé pour les package du cran dans R grâce à la commande :</p>
<pre><code class="R">update.packages<span class="p">(</span>ask<span class="o">=</span><span class="kc">FALSE</span><span class="p">,</span> checkBuilt<span class="o">=</span><span class="kc">TRUE</span><span class="p">)</span></code></pre>
<div><a href="https://linuxfr.org/users/lepnume/journaux/gnu-r-version-4-0-0-est-disponible.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/120207/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/lepnume/journaux/gnu-r-version-4-0-0-est-disponible#comments">ouvrir dans le navigateur</a>
</p>
Le Pnumehttps://linuxfr.org/nodes/120207/comments.atomtag:linuxfr.org,2005:News/382722017-11-02T14:33:37+01:002017-11-04T12:21:31+01:00Atelier Barcamp I. A. & Droit le 7 novembre 2017 à ParisLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Lors des six derniers mois, magistrats, avocats et juristes de l’association <a href="http://openlaw.fr/">Open Law</a>, dont la démarche est résolument orientée sur la production de ressources ouvertes, ont travaillé d’arrache‐pied pour créer un jeu de données de <em>Natural Language Processing</em> (NLP) en langue française.</p>
<p>Le 7 novembre prochain au <em>Square</em>, un événement est organisé <strong>pour faire se rencontrer juristes et développeurs</strong> afin de déterminer des cas d’usage concrets pour ce jeu de données. Affichage du plan des décisions, recherche ciblée dans la jurisprudence, extraction d’informations précises, outils de justice prédictive… Quels usages et quels services peuvent être créés grâce à ce jeu de données ? Telle est la problématique qui sera mise à l’honneur à l’occasion de ce prochain rendez‐vous, au cours duquel nous définirons ensemble les défis qui seront portés le 7 décembre prochain lors du <em>Hackathon I. A. & Droit</em> organisé dans le cadre du <em>Paris Open Source Summit</em>.</p>
<p>Date et lieu :</p>
<ul>
<li>mardi 7 novembre 2017 à 18 h 30</li>
<li><a href="https://www.openstreetmap.org/search?query=3%20passage%20Saint-Pierre%20Amelot%2075011%20Paris#map=19/48.86234/2.36839"><em>Le Square</em>, 3 passage Saint‐Pierre Amelot, 75011 Paris</a></li>
</ul></div><ul><li>lien nᵒ 1 : <a title="https://huit.re/wyFQrPn5" hreflang="fr" href="https://linuxfr.org/redirect/100907">Inscription obligatoire et gratuite sur Meetup.com</a></li></ul><div><p>Dans ce jeu de données, chaque paragraphe, de plusieurs centaines de décisions de justice récentes, a été typé à la main (parmi plus de trente catégories) grâce au logiciel libre <a href="http://brat.nlplab.org/">Brat</a>. L’objet de ce jeu de données, qui a vocation à être publié sous <a href="https://opendatacommons.org/licenses/odbl/">licence ODbL</a>, est de permettre d’apprendre à reconnaître la structure d’une décision de justice.</p>
<p>Le jeu de données pourra être exploité grâce des algorithmes <em>open source</em>. Quant aux développements logiciels, l’analyseur XML original étant en Scala-Xml, il fera appel à des compétences en <strong>R, Python ou Scala</strong>.</p>
<p>Nous espérons vous retrouver nombreux pour contribuer en participant à cette aventure !</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f7365637572652e6d65657475707374617469632e636f6d2f70686f746f732f6576656e742f352f362f342f362f3630305f3436353830323038362e6a706567/600_465802086.jpeg" alt="Atelier Barcamp I. A. & Droit" title="Source : https://secure.meetupstatic.com/photos/event/5/6/4/6/600_465802086.jpeg"></p>
<p>Inscription obligatoire et gratuite : <a href="https://huit.re/wyFQrPn5">https://huit.re/wyFQrPn5</a>.</p></div><div><a href="https://linuxfr.org/news/atelier-barcamp-i-a-droit-le-7-novembre-2017-a-paris.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/112990/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/atelier-barcamp-i-a-droit-le-7-novembre-2017-a-paris#comments">ouvrir dans le navigateur</a>
</p>
Open LawDavy DefaudNÿcobubar🦥Benoît Sibaudhttps://linuxfr.org/nodes/112990/comments.atomtag:linuxfr.org,2005:Diary/352912014-09-29T19:44:52+02:002014-09-29T19:44:52+02:00[Parution] R et Espace (géographie) -- collection FramabookLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Bonjour à tous,</p>
<p>La collection Framabook (projet Framasoft) ne s'arrête pas ! Cette fois, nous proposons un ouvrage d'initiation au logiciel libre R appliqué à l'analyse géographique. </p>
<p>Pourquoi un tel ouvrage ? D'abord parce que R est un logiciel libre (issu du projet GNU) possédant sans doute un des plus larges éventail de fonctionnalités tant ses contributeurs l'enrichissent depuis plus de 15 ans.</p>
<p>Le livre <em>R et espace</em> est une illustration des nombreux domaines dans lesquels R peut être appliqué. </p>
<hr><h2 id="annonce-de-parution">ANNONCE DE PARUTION</h2>
<p>Groupe ElementR</p>
<p><em>R et espace. Traitement de l'information géographique</em></p>
<hr><p>Un irremplaçable support technique pour les utilisateurs de R appliqué à l'analyse de l'information géographique! </p>
<hr><p><strong>SORTIE : le 30 septembre 2014</strong></p>
<p>Un manuel pour s'initier simultanément au traitement de données géographiques et à la programmation avec R. L’éclairage est celui de l’analyse spatiale, à savoir des méthodes mises en œuvre pour l’étude des organisations dans l’espace. Accompagné de jeux de données, il peut être utilisé comme support pédagogique. </p>
<p><a href="http://framabook.org/16-r-et-espace/">Lien direct</a></p>
<ul>
<li>ISBN: 979-10-92674-06-4</li>
<li>Prix: 15 EUR (version papier)</li>
<li>Format: A5, N et B</li>
<li>Pages: 244 + vi</li>
<li>Licence: Creative Commons By-Sa</li>
</ul><h3 id="les-auteurs">Les auteurs</h3>
<p>Le groupe ElementR s’est constitué en 2012 au sein de l’UMR Géographie-cités pour organiser des formations au logiciel R destinées aux géographes. Huit personnes y ont contribué qui étaient alors ingénieurs, doctorants ou anciens doctorants dans ce laboratoire :</p>
<ul>
<li>Laurent Beauguitte, chargé de recherche CNRS (UMR IDEES),</li>
<li>Élodie Buard, ingénieure de recherche à l'IGN,</li>
<li>Hadrien Commenges, post-doctorant au LEESU,</li>
<li>Robin Cura, doctorant à Géographie-cités (UMR 8504),</li>
<li>Florent Le Néchet , maître de conférences à l'Université Paris-Est Marne-la-Vallée,</li>
<li>Marion Le Texier, post-doctorante à l'Institut universitaire européen de Florence,</li>
<li>Hélène Mathian, ingénieure de recherche CNRS (UMR EVS),</li>
<li>Sébastien Rey-Coyrehourcq, doctorant à Géographie-cités (UMR 8504).</li>
</ul><hr><p>Association Framasoft / Collection Framabook<br><a href="http://framabook.org">http://framabook.org</a></p>
<p><img src="//img.linuxfr.org/img/687474703a2f2f6672616d61626f6f6b2e6f72672f776f726470726573732f77702d636f6e74656e742f75706c6f6164732f323031342f30392f5072656d5f636f75765f526573706163655f353030783638312e706e67/Prem_couv_Respace_500x681.png" alt="Titre de l'image" title="Source : http://framabook.org/wordpress/wp-content/uploads/2014/09/Prem_couv_Respace_500x681.png"></p><div><a href="https://linuxfr.org/users/cmasutti/journaux/parution-r-et-espace-geographie-collection-framabook-d0221cbf-82ee-4d8a-b3ba-e162427c979d.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/103447/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/cmasutti/journaux/parution-r-et-espace-geographie-collection-framabook-d0221cbf-82ee-4d8a-b3ba-e162427c979d#comments">ouvrir dans le navigateur</a>
</p>
Christophe Masuttihttps://linuxfr.org/nodes/103447/comments.atomtag:linuxfr.org,2005:News/348892014-01-19T10:23:54+01:002014-01-19T10:23:54+01:00Pandas, une bibliothèque pour manipuler facilement des donnéesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<div><p>À l'occasion de la sortie de la version 0.13, je vous présente cette bibliothèque basée sur Python qui permet de travailler simplement et efficacement avec des données structurées. Jusqu'à présent, les versions se sont enchaînées rapidement mais celle-ci arrive plusieurs mois après la précédente. On peut donc espérer qu'un code développé pour cette nouvelle version demandera moins de maintenance.</p>
<p><img src="//img.linuxfr.org/img/687474703a2f2f70616e6461732e7079646174612e6f72672f5f7374617469632f70616e6461735f6c6f676f2e706e67/pandas_logo.png" alt="Logo pandas" title="Source : http://pandas.pydata.org/_static/pandas_logo.png"></p>
<p>Les principales possibilités sont :</p>
<ul>
<li>récupérer des données depuis des fichiers CSV, tableaux Excel, des pages web, HDF5, <a href="http://pandas.pydata.org/pandas-docs/dev/io.html">etc.</a> ;</li>
<li>grouper, découper, alléger, déplacer, écrire les données ;</li>
<li>ces données peuvent être à une ou deux dimensions, avec des manques, ou encore temporelles avec ou sans périodicité.</li>
</ul><p>Pour peu que les données soient correctement formatées, pandas peut s'en sortir même dans le cas où la quantité dépasse les capacités de votre machine en <a href="http://pandas.pydata.org/pandas-docs/dev/io.html#iterating-through-files-chunk-by-chunk">traitant les sources morceaux par morceaux</a>.</p>
<p>Le développement de cette bibliothèque s'inscrit dans la problématique de disposer d'outils pour manipuler de gros volumes de données dans le but de leur exploitation scientifique ou commerciale.</p>
<p><em>Note : pandas fonctionne avec la même base de code sur Python 2 et 3 mais ce n'est, peut-être, pas le cas de toutes les dépendances.</em></p></div><ul><li>lien nᵒ 1 : <a title="http://pandas.pydata.org/" hreflang="en" href="https://linuxfr.org/redirect/88738">Site officiel</a></li><li>lien nᵒ 2 : <a title="https://github.com/pydata/pandas" hreflang="en" href="https://linuxfr.org/redirect/88739">Page GitHub</a></li><li>lien nᵒ 3 : <a title="http://pandas.pydata.org/pandas-docs/stable/whatsnew.html" hreflang="en" href="https://linuxfr.org/redirect/88740">Les nouveautés détaillées</a></li><li>lien nᵒ 4 : <a title="http://vimeo.com/59324550" hreflang="en" href="https://linuxfr.org/redirect/88741">Vidéo de présentation</a></li><li>lien nᵒ 5 : <a title="http://scipy.org/" hreflang="en" href="https://linuxfr.org/redirect/88742">SciPy : portail des outils Python pour la science</a></li><li>lien nᵒ 6 : <a title="http://pandas.pydata.org/pandas-docs/dev/10min.html#min" hreflang="en" href="https://linuxfr.org/redirect/88782">Découvrir pandas en 10 minutes</a></li><li>lien nᵒ 7 : <a title="http://shop.oreilly.com/product/0636920023784.do" hreflang="en" href="https://linuxfr.org/redirect/89005">O'Reilly - Python for data analysis</a></li><li>lien nᵒ 8 : <a title="http://www.youtube.com/watch?v=w26x-z-BdWQ" hreflang="en" href="https://linuxfr.org/redirect/89006">Vidéo plus détaillée (3h)</a></li></ul><div><h2 id="pourquoi-pandas">Pourquoi pandas</h2>
<p>L'objectif de pandas est d'être le meilleur outil statistique qui soit aussi bien performant, facile d'utilisation et flexible. Le logiciel existe depuis 2008 mais son développement s'est fortement accéléré avec la publication de la version 0.3 en février 2011 (le nombre de modifications pour cette version dépassait celui des modifications depuis le début de projet). Depuis les nouveautés et les corrections de bugs s'enchaînent à un rythme élevé comme le montre la paga <a href="http://pandas.pydata.org/pandas-docs/dev/whatsnew.html">What's new</a>.<br>
Pour mieux comprendre la mécanique interne de pandas, je vous suggère de consulter le blog de <a href="http://wesmckinney.com/blog/">Wes McKinney</a>, le leader du projet.</p>
<h2 id="comparaison-avec-r">Comparaison avec R</h2>
<p>Les statisticiens dans la salle doivent se demander pourquoi pandas a été développé alors que R fonctionne très bien. <code>pandas</code> se base sur les bonnes idées de R et s'attache à apporter les fonctionnalités manquantes. Du côté écosystème, R possède l'inestimable <a href="http://cran.r-project.org/">CRAN </a> qui est le dépôt des différents paquets venant enrichir la bibliothèque de base, tandis que <code>pandas</code> profite de l'engouement autour des outils scientifiques en Python. L'aspect généraliste de Python permet également de développer l'intégralité d'une application avec un seul langage ce qui n'est pas le cas de R. Reste la licence de R (GPL) qui peut sembler un obstacle pour certaines finalités, Pandas étant sous licence BSD.</p>
<h2 id="ressources">Ressources</h2>
<p>Bien que la documentation soit étoffée, pour ceux qui souhaitent être accompagnés sur des cas concrets, il existe un <a href="https://github.com/jvns/pandas-cookbook">livre de recettes</a> ou bien un <a href="https://bitbucket.org/hrojas/learn-pandas">tutoriel</a>. Voici également <a href="https://github.com/pydata/pandas/issues/5837">une page</a> qui rassemble des liens qui seront intégrés à la documentation officielle dans la version suivante.</p>
<h2 id="Écosystème">Écosystème</h2>
<p>Pandas ne vit pas dans un monde cloisonné et sert de base ou de complément à <a href="http://pandas.pydata.org/pandas-docs/stable/ecosystem.html">d'autres logiciels</a> que ce soit pour manipuler des données géographiques, faire des statistiques ou encore tendre à remplacer <a href="http://matplotlib.org">matplotlib</a> pour certains usages.</p>
<h2 id="politique-de-développement">Politique de développement</h2>
<p>Cette version ayant mis un peu de temps à sortir (surtout, il y a eu quelques couacs entre l'étiquetage de cette version 0.13, la mise à jour du site et la mise à disposition sur <a href="https://pypi.python.org/pypi/pandas">PyPi</a>), il a été décidé que la prochaine devrait voir le jour dans trois mois sans attendre que les nouvelles fonctionnalités soient terminées.</p></div><div><a href="https://linuxfr.org/news/pandas-une-bibliotheque-pour-manipuler-facilement-des-donnees.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/100621/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/pandas-une-bibliotheque-pour-manipuler-facilement-des-donnees#comments">ouvrir dans le navigateur</a>
</p>
Nonolapéro_PhiX_Benoît Sibaudkarteum59NÿcoJiehongolivierwebpalm123Benoîtmornikhttps://linuxfr.org/nodes/100621/comments.atomtag:linuxfr.org,2005:News/339682013-04-04T21:26:28+02:002013-04-04T21:26:28+02:00Sortie de R version 3.0.0Licence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<div><p>Le projet R annonce la sortie de la version 3.0.0 du logiciel statistique du même nom (pre-release le 7 mars 2013, sortie officielle le 3 avril).</p>
<p>R désigne à la fois un langage de programmation et son interpréteur. Historiquement, R est un dialecte dérivé du langage S, implémenté dans le logiciel propriétaire S-PLUS. L'aventure R a débuté en 1993, mais c'est à partir des années 2000 qu'il a pris une importance majeure dans le paysage des langages destinés aux applications statistiques. R rivalise aujourd'hui avec ses concurrents SAS (<a href="http://fr.wikipedia.org/wiki/Statistical Analysis System" title="Définition Wikipédia">Statistical Analysis System</a>), SPSS (<a href="http://fr.wikipedia.org/wiki/Statistical Package for the Social Sciences" title="Définition Wikipédia">Statistical Package for the Social Sciences</a>), ou <a href="http://fr.wikipedia.org/wiki/Stata" title="Définition Wikipédia">STATA</a> ; il est devenu incontournable dans certaines disciplines, notamment la biologie. </p>
<p>Le changement de version majeur (2.15.3 vers 3.0) ne signale pas une transition importante (voir le <a href="http://stat.ethz.ch/R-manual/R-devel/doc/html/NEWS.html">changelog</a>), mais marque une évolution progressive (la version 2.0 date de 2004). La mise à jour requiert cependant une réinstallation complète.</p>
<p>R fonctionne de manière modulaire, avec un cœur relativement réduit, sur lequel peuvent se greffer des bibliothèques de fonctions fournies sous forme de « paquets ». R doit certainement une partie de son succès à l'activité de sa communauté, puisque plus de 4700 paquets activement maintenus sont disponibles au téléchargement sur le <a href="http://cran.r-project.org/">site officiel</a>, sans compter les projets indépendants, comme <a href="http://www.bioconductor.org/">bioconductor</a>. </p>
<p>R est avant tout destiné au traitement et à l'analyse des données : tests statistiques, <em>data mining</em>, et production de graphiques de qualité (destinés à la publication). Le langage est de plus en plus utilisé pour produire des scripts portables, ou pour réaliser des simulations numériques (<a href="http://fr.wikipedia.org/wiki/MCMC" title="Définition Wikipédia">MCMC</a>, typiquement). Réputé inefficace en tant que langage interprété, la possibilité de coder les fonctions critiques en C tout en utilisant la syntaxe « haut-niveau » de R ouvre une niche écologique significative pour le développement d'applications statistiques. </p></div><ul><li>lien nᵒ 1 : <a title="http://www.r-project.org/index.html" hreflang="en" href="https://linuxfr.org/redirect/85539">Page officielle du projet R</a></li><li>lien nᵒ 2 : <a title="http://www.r-project.org/index.html" hreflang="en" href="https://linuxfr.org/redirect/85540">Liste des paquets disponibles</a></li><li>lien nᵒ 3 : <a title="http://gallery.r-enthusiasts.com/" hreflang="en" href="https://linuxfr.org/redirect/85541">R graph gallery : illustration des possibilités graphiques de R</a></li></ul><div><p>Au cours des dernières années, R s'est en effet enrichi pour fournir des fonctionnalités destinées au développement d'applications complexes : les classes de type S4 pour la programmation objet (typage, héritage, etc.) ; la bibliothèque « compiler » qui permet de compiler à la volée, et ainsi d'obtenir une accélération significative de l'exécution des scripts ; et la bibliothèque « parallel » qui, comme son nom l'indique, implémente un embryon de programmation multi-threads (seulement sous les systèmes permettant fork()). </p>
<p>Il est évidemment impossible de faire une liste exhaustive des avantages réels ou supposés de R ; on peut citer :</p>
<ul><li>La portabilité (GNU/Linux, BSD, Mac OS X et Windows) ;</li>
<li>La profusion de paquets contribués ;</li>
<li>Sa large diffusion (savoir coder en R est une condition souvent requise pour un job de bio-informaticien) ;</li>
<li>La richesse du langage de base (plusieurs milliers de fonctions disponibles sans installation de paquets) ;</li>
<li>La concision du code ;</li>
<li>La qualité de la documentation (un système automatique vérifie que chaque fonction est correctement documentée lors de la compilation des paquets).</li>
</ul><p>Évidemment, on peut jouer l'avocat du diable et lister les écueils :</p>
<ul><li>Un manque d'homogénéité du fait du mode de développement modulaire (pas de conventions officielles sur le nommage, les indentations, etc.) ;</li>
<li>Illisible si mal codé (en particulier du fait de l'imbrication des parenthèses, crochets courbes et carrés) ;</li>
<li>Courbe d'apprentissage assez abrupte ;</li>
<li>Idiomes différents de ceux du C (par exemple, les boucles for() sont à proscrire la plupart du temps).</li>
</ul><p>Un exemple valant toujours mieux qu'une longue explication :</p>
<pre>
<code class="r"><span class="c1"># Rien que du classique</span>
print<span class="p">(</span><span class="s">"Hello world!"</span><span class="p">)</span>
<span class="c1"># Import-export</span>
data <span class="o"><-</span> read.csv<span class="p">(</span><span class="s">"mySpreadsheet.csv"</span><span class="p">)</span>
write.table<span class="p">(</span>data<span class="p">,</span> <span class="s">"textfile.txt"</span><span class="p">,</span> sep<span class="o">=</span><span class="s">"\t"</span><span class="p">)</span>
<span class="c1"># Manipulation de données: </span>
<span class="c1"># on ne garde que les lignes du tableau dont la deuxième colonne </span>
<span class="c1"># est supérieure à la moyenne</span>
data2 <span class="o"><-</span> data<span class="p">[</span>data<span class="p">[,</span><span class="m">2</span><span class="p">]</span><span class="o">></span>mean<span class="p">(</span>data<span class="p">[,</span><span class="m">2</span><span class="p">]),]</span>
<span class="c1"># on ajoute une colonne avec la médiane de chaque ligne</span>
data3 <span class="o"><-</span> cbind<span class="p">(</span>data<span class="p">,</span> apply<span class="p">(</span>data<span class="p">,</span> MARGIN<span class="o">=</span><span class="m">1</span><span class="p">,</span> FUN<span class="o">=</span>median<span class="p">))</span>
<span class="c1"># Production de graphiques et statistiques: </span>
<span class="c1"># régression x: première colonne, y:dernière colonne</span>
pdf<span class="p">(</span><span class="s">"myplot.pdf"</span><span class="p">)</span>
plot<span class="p">(</span>data<span class="p">[,</span><span class="m">1</span><span class="p">],</span> data<span class="p">[,</span>ncol<span class="p">(</span>data<span class="p">)],</span> xlab<span class="o">=</span><span class="s">"x"</span><span class="p">,</span> ylab<span class="o">=</span><span class="s">"y"</span><span class="p">)</span>
abline<span class="p">(</span>lm<span class="p">(</span>data<span class="p">[,</span>ncol<span class="p">(</span>data<span class="p">)]</span> ~ data<span class="p">[,</span><span class="m">1</span><span class="p">]))</span>
dev.off<span class="p">()</span>
</code>
</pre></div><div><a href="https://linuxfr.org/news/sortie-de-r-version-3-0-0.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/97618/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/sortie-de-r-version-3-0-0#comments">ouvrir dans le navigateur</a>
</p>
arnaudusalpentuxNÿcoclaudexSylvestre Ledruhttps://linuxfr.org/nodes/97618/comments.atomtag:linuxfr.org,2005:News/196992005-10-08T22:51:37+02:002005-10-08T22:51:37+02:00R-project bouge, R version 2.2.0 sort<div>R est un environnement utilisant un langage pour l'analyse mathématique et statistique sur ordinateur, et produit également des graphiques de très grande qualité. Il est extrêmement modulaire ce qui a grandement facilité la création de modules spécifiques par des tiers. On trouve ainsi des dizaines de modules spécifiques pour l'analyse d'un type de problème précis.
<br />
<br />
R implémente notamment en open-source le langage S (des laboratoires Bell maintenant Lucent Technologies), dont les programmes tournent quasiment sans modification avec R, ce qui en fait un outil de choix pour les recherches mettant en oeuvre les statistiques : bioinformatique, analyse de marchés financiers, analyse de données spatiales...
<br />
<br />
Le projet R est encore bien peu connu du public probablement à cause de son coté austère et ciblé. C'est pourquoi les sorties se font discrètes. Hier c'est la version 2.2.0 qui a été publiée, avec son lot de changements concernant principalement le confort d'utilisation.
<br />
<br />
R peut certes sembler rebutant pour l'étudiant souhaitant faire quelques calculs statistiques, mais - une fois pris en main - il se révèle très efficace.</div><ul><li>lien nᵒ 1 : <a title="http://www.r-project.org/" hreflang="en" href="https://linuxfr.org/redirect/43876">La page du projet</a></li><li>lien nᵒ 2 : <a title="http://www.r-project.org/screenshots/screenshots.html" hreflang="en" href="https://linuxfr.org/redirect/43877">Les screenshots</a></li><li>lien nᵒ 3 : <a title="http://cran.r-project.org/doc/FAQ/R-FAQ.html" hreflang="en" href="https://linuxfr.org/redirect/43878">La FAQ</a></li><li>lien nᵒ 4 : <a title="http://www.r-project.org/other-projects.html" hreflang="en" href="https://linuxfr.org/redirect/43879">Quelques modules supplémentaires</a></li><li>lien nᵒ 5 : <a title="http://fr.wikipedia.org/wiki/R_%28logiciel%29" hreflang="fr" href="https://linuxfr.org/redirect/43880">Un petit article wikipedia</a></li></ul><div>Ce projet montre bien qu'une conception bien définie et modulaire d'un projet est source de participation extérieure, denrée hélas plus rare que ce qu'il n'y parait dans le développement libre :)</div><div><a href="https://linuxfr.org/news/r-project-bouge-r-version-220-sort.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/19012/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/r-project-bouge-r-version-220-sort#comments">ouvrir dans le navigateur</a>
</p>
https://linuxfr.org/nodes/19012/comments.atomtag:linuxfr.org,2005:News/100402002-10-20T21:29:01+02:002002-10-20T21:29:01+02:00Le projet R<div>Le logiciel R est un clone libre de S-Plus, et constitue un système complet et très puissant pour la gestion et l'analyse statistique de données. Le développement est très actif, et la version 1.6 du logiciel vient de sortir récemment.
<br />
<br />
Il s'agit d'un projet pas forcément très grand public, mais qui est sans doute appelé à prendre de l'envergure, notamment quand on connaît le prix des licences de logiciels de type SAS ou SPSS.
<br />
<br />
A suivre, donc...</div><ul><li>lien nᵒ 1 : <a title="http://www.r-project.org/" hreflang="en" href="https://linuxfr.org/redirect/18685">Le site officiel</a></li><li>lien nᵒ 2 : <a title="http://cran.r-project.org/doc/contrib/rdebuts_fr.pdf" hreflang="fr" href="https://linuxfr.org/redirect/18686">Une introduction en français, par Emmanuel Paradis (format PDF)</a></li></ul><div></div><div><a href="https://linuxfr.org/news/le-projet-r.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/9400/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/le-projet-r#comments">ouvrir dans le navigateur</a>
</p>
Julien Barnierhttps://linuxfr.org/nodes/9400/comments.atom