Subscribe RSS

Spydemon's personal blog

  • Clef GPG

Archives Mensuelles: novembre 2017

Une introduction aux graphiques avec R

28 novembre 2017 Posté par Spydemon sous Programmation
Pas de commentaire
Bonjour. Je vous propose de faire une introduction à la modélisation de données à travers l’utilisation du langage R. D’après Wikipedia, il s’agit d’un langage libre dédié aux statistiques et à la science des données. Bien entendu, nous n’évoquerons ici qu’une infime partie de ce dont cet écosystème est capable dans la mesure où la […]

Une grande variété de types de graphes différents

Pour cette illustration, j’ai employé la plus basique des méthodes de représentation les données : un graphique en deux dimensions. R nous permet d’en utiliser une variété d’autres de façon tout aussi simple. Il est même possible pour chacun d’entre nous de réaliser nos propres systèmes. Cette page en liste quelques-uns.

Ces types de graphes sont également exportables dans les formats précédemment évoqués : PNG, PDF, TikZ, mais aussi beaucoup d’autres (svg, cairo, etc.).

La création de documents Web interactifs

L’interaction côté client

Rédiger des documents texte de qualité est une bonne chose, mais profiter de l’interactivité que peut nous offrir le Web en est une autre, autrement plus intéressante ! Ainsi, un grand nombre de libraires JavaScript de représentation des données permettent d’être directement utilisables depuis R grâce au projet htmlwidget.

De cette façon, au lieu de réaliser une image PNG, un PDF, ou un autre format de dessin statique, nous générerons une page HTML chargeant toutes les dépendances nécessaires à l’affichage de la représentation via la librairie choisie.

Voyons un exemple présent sur le site sus-cité permettant d’utiliser la bibliothèque Bokeh.

> library(rbokeh) #Chargement de rbokeh
> # Nous affichons ici un jeu de données préchargé dans l'environnement R 
> # à des fins de test. On va l'utiliser pour générer notre graphique.
> iris
   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
[…]

> figure() %>%
+ # On affiche un graphe ayant la longueur du sepale 
+ # en abscisse, et sa largeur en ordonnée.
+ ly_points(Sepal.Length, Sepal.Width, data = iris,
+ # La couleur et la forme des points dépendra de l'espèce.
+   color = Species, glyph = Species,
+ # Quand on passe la souris sur un point, des informations 
+ # complémentaires seront disponible, à savoir la hauteur et largeur du sépale.
+   hover = list(Sepal.Length, Sepal.Width)) 

C’est tout ce dont on a besoin ! Bon pour être franc, il est vrai que l’intérêt peut se montrer un peu limité pour des développeurs habitués à travailler avec des technologies Web, car plutôt que de passer par R, nous pouvons directement utiliser les libraires sous-jacentes, ce qui permettrait peut-être d’avoir un code plus optimisé. Néanmoins, ça reste une solution intéressante par sa rapidité de mise en œuvre.

Attention, je pense que l’intégration du graphique dans cette page est assez mauvaise, car il s’agit d’une iframe dont l’ensemble des dépendances (notamment bokeh.min.js rbokeh.js htmlwidget.js) on été injectées en base 64 dans le contenu même de la page. Celle-ci est donc beaucoup plus lourde, et surtout ne permet ni la mise en cache les lib par le navigateur, ni la réutilisation dans le cas où plusieurs graphiques seraient sur la même page. Plus d’explications sur la méthode ici.

Shiny : le serveur web dynamique

Là où la chose peut devenir plus intéressante encore, c’est si nous voulons ajouter un cran de plus au niveau de l’interactivité en permettant de charger dynamiquement l’affichage côté serveur. C’est ce que Shiny nous propose.

Prenons par exemple ce graphique, qui représente le prix de diamants en fonction de leurs carats, depuis des données de test :

> library(ggplot2)
> # Génération du graphique
> p <- ggplot(diamonds, aes(x=carat, y=price)) + geom_point()
> # Exportation du graphique en SVG
> ggsave(file="diamonds.svg", plot=p, width=6, height=4)
Graphique du prix des diamants en fonction de leurs carats

Prix des diamants en fonction de leurs carats

Nous pouvons trouver que celui-ci affiche bien trop d’éléments à notre goût (53 940 points). Pour pouvoir choisir dynamiquement le nombre de points à représenter, nous pourrions utiliser le code de ces deux fichiers :

library(shiny)

# Les données à utiliser seront celles du jeu "diamonds"
dataset <- diamonds

shinyUI(fluidPage(
 # Ici, on dessine la page.
 title = 'Use the DT package in shiny',
 sidebarLayout (
   # On utilisera deux colonnes dans notre page.
   # La première contiendra un slider.
   sidebarPanel (
     sliderInput("bins", "Number of bins:", 
     min= 1, max = nrow(dataset), value = 1000)
   ),
   # La seconde un graphique nommé "distPlot".
   mainPanel (plotOutput("distPlot"))
 )
))
library(shiny)
library(DT)
library(ggplot2)

shinyServer(function(input, output, session) {
# Le dataset ne correspond plus à l'ensemble de éléments
# présent dans "diamonds", mais uniquement des x premières
# lignes, avec x défini par la valeur de notre slider
# "bins".
dataset <- reactive({
   diamonds[sample(nrow(diamonds), input$bins),]
 })
 # On dessine notre graphique qu'on renverra au client
 # dans l'élément "distPlot".
 output$distPlot <- renderPlot({
    p <- ggplot(dataset(), aes_string(x='carat', y='price')) + geom_point()
    print(p)
 })
})

Et enfin, de lancer notre application de cette façon :

> package("shiny")
> package("ggplot2")
> # Si ui.R et server.R sont dans le dossier courant.
> runApp(".")

Listening on http://127.0.0.1:5642

Maintenant, on aura un serveur Web Shiny qui s’exécutera sur notre machine (ici sur le port 5642), que l’on pourra interroger pour récupérer une page HTML. Deux éléments sont créés depuis le code ui.R : un slider nommé « bins », et un graphique « distPlot ». Ce dernier est généré depuis le fichier server.R, à l’aide de la valeur du slider (initialisée à 1000).

Capture d'écran de notre graphique et de son slider.

Capture d’écran de notre graphique et de son slider.

Encore une fois, cet exemple est très simpliste et est loin de rendre honneur à l’étendue de ce que Shiny peut gérer. Il permet par exemple de concevoir des dashboard entiers. Mais comme évoqué dans le titre de cet article, il ne s’agit ici que d’introductions. Une des questions que je me pose quand même avec Shiny réside dans la consommation en ressources de l’outil, et si un unique serveur est en mesure de gérer plusieurs dashboards.

Conclusion

Je pense en avoir fini avec ce tour des diverses possibilités que nous offre R dans la représentation des données. Il s’agit d’un travail de synthèse que j’ai effectué par curiosité après en avoir entendu parler. Malgré ma vigilance, il est donc probable que des petites erreurs se soient glissées dans le texte, ou alors que je sois passé à côté d’autres outils qui auraient eux aussi mérités leur paragraphe ici. Si tel est le cas, je vous invite à m’en faire part. En attendant, je ne peux que vous encourager à approfondir vos connaissances dans ces outils et à mettre tout cela en pratique !


Crédits images :

  • Le graphique en couverture par 1492ANDIBLAIR.
  • Les autres documents liés à cet articles (les graphes, fichier pdf, etc.) sont tous de moi, et sont inspirés de sources indiqués dans les paragraphes respectifs.

Publication originale :

Cet article a été publié initialement sur le blog Netapsys.
Logo Netapsys

-->
Catégories
  • DIY (4)
  • Electronique (3)
  • Expatriations (15)
    • 1. Squat Grenoble 2010 (8)
    • 2. Camping Haspelschiedt 2010 (5)
  • Informations (1)
  • LTDI (4)
  • Pensés abstraites (8)
  • Périples (7)
  • Programmation (22)
    • Embarqué (2)
    • Maintenance (1)
    • Sysadmin (7)
    • Théorie (6)
  • VIA (3)
Étiquettes
amplificateur ampoule ancien AOP Atmel bac backup blog C++ carton convertion crous Danemark DBus denmark dut début développeur facebook France GIO GTK Horsens infixe lampe led Linux lucie M1280 opérationnel orientation photo podcast postbac postfixe profil présentation Raspberry Pi réseaux sondage sécurité tension VIA voyage économie
Archives
  • août 2018 (1)
  • juin 2018 (1)
  • novembre 2017 (1)
  • juillet 2017 (1)
  • juin 2017 (1)
  • avril 2017 (1)
  • janvier 2017 (1)
  • juillet 2016 (1)
  • juin 2016 (1)
  • avril 2016 (1)
  • novembre 2015 (2)
  • mai 2015 (2)
  • avril 2015 (1)
  • février 2015 (1)
  • décembre 2014 (1)
  • décembre 2013 (1)
  • novembre 2013 (2)
  • septembre 2013 (2)
  • juin 2013 (1)
  • mai 2013 (1)
  • avril 2013 (1)
  • janvier 2013 (1)
  • novembre 2012 (1)
  • août 2012 (1)
  • juillet 2012 (2)
  • mai 2012 (2)
  • avril 2012 (2)
  • mars 2012 (1)
  • février 2012 (1)
  • janvier 2012 (2)
  • décembre 2011 (4)
  • novembre 2011 (1)
  • octobre 2011 (1)
  • juin 2011 (1)
  • mai 2011 (1)
  • décembre 2010 (1)
  • août 2010 (2)
  • juillet 2010 (4)
  • mai 2010 (9)
  • mars 2010 (3)
Blogs d'amis
  • Choix Libres
  • Johnn'y Space
  • Shades of blue
  • Soulou's blog
Articles récents
  • L’histoire de la création de Linux
  • Comment juger de la qualité de la connectivité d’un site Web ?
  • Une introduction aux graphiques avec R
  • Réalisation d’une (grosse) armoire en carton
  • Comprendre AppArmor
Commentaires récents
  • Raclet dans Bookeen et leur foutage de gueule
  • Gregory dans Bookeen et leur foutage de gueule
  • chataigne dans Bookeen et leur foutage de gueule
  • Alain Riou dans Bookeen et leur foutage de gueule
  • Rodrigues dans Bookeen et leur foutage de gueule
Spydemon's personal blog powered by WordPress and The Clear Line Theme

Compression Plugin created by Jake Ruston's Wordpress Plugins - Powered by Protection Racket and Kanye West.