Archives Mensuelles: novembre 2017
Une introduction aux graphiques avec R
28 novembre 2017 | Posté par Spydemon sous Programmation |
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)

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).
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 :
Commentaires récents