Journal Faire des graphiques à partir de données : comparaison

18
17
mai
2015

Sommaire

Bon dimanche à tous !

Tracer des graphiques, je l'ai fait à la main à l'école, comme tous je suppose. Aujourd'hui, l'ordinateur s'en charge bien mieux. Enfin, c'est ce qu'on pourrait penser, mais je trouve que ce n'est pas si bien que ça en fait.

Je vous propose donc une petite comparaison pour créer le même graphique de plusieurs manières différentes : Libreoffice Calc, Calligra Sheets, Gnumeric et à la main (Python/Pandas).

L'idée étant de voir le résultat par défaut obtenu, puis d'essayer d'améliorer ça, et de conclure.

Cas considéré

Je m'intéresse ici à l'évolution de la population humaine de -10 000 AEC à 2010 EC, basé sur les chiffres de la Wikipédia (Hyde 2007).
J'ai mis les données dans un fichier csv que vous pouvez récupérer ici (si vous souhaitez essayer).

Dans un premier temps, l'idée étant de voir à quoi ça ressemble, et de proposer un graphique normal.

Dans un second temps, après s'être aperçu que l'on n'y voit pas grand chose, essayer de produire un deuxième graphique avec une échelle logarithmique en ordonnée.

Libreoffice Calc

L'ouverture du fichier CSV fonctionne sans problème avec les paramètres par défaut.

Pour créer un graph, il faut sélectionner la zone de données (avec le titre de celles-ci), puis Insert > Chart ou de cliquer sur le bouton Chart quelque part dans la barre du haut.

Par défaut, il présente des histogrammes pour les deux séries (les valeurs en abscisse étant l'index de chaque valeur). Il faut sélectionner le type XY (Scatter), et c'est beaucoup mieux (ligne seule).

Next, on voit que First row as label est sélectionné, mais bien que la légende est bonne, les axes ne sont pas nommées.

Next et il est maintenant possible de donner des noms aux axes, mais c'est pas rempli par défaut, et ça ne s'affiche pas.

Next et en fait, on peut maintenant mettre un titre au graphique, ainsi que nommer les axes pour de vrai.

Finish, et je n'ai rien changé, puisque je souhaite voir le résultat par défaut brute de décoffrage, que vous pouvez admirer ci-dessous :

Brut de Libreoffice Calc

Bref, c'est pas super, alors j'essaie de changer un peu tout ça (avec pas mal de recherche sur le net), et je me rend compte que double-cliquer dans le graph n'est pas anodin, puisque si c'est sur un axe, alors on accède aux propriétés de celui-ci, pareil pour l'arrière plan, la grille, etc. C'est pas franchement intuitif (puisque toutes les fenêtres se ressemblent). J'arrive finalement à ce résultat :

Graphique linéaire avec LibreOffice Calc

Calligra Sheets

Ouvrir un fichier ne marche pas pour un csv… Il ne faut pas oublier d'installer calligra-filters, et l'importation fonctionne maintenant correctement.

Pareil, si on veut faire un graphique, il ne faut pas oublier d'installer calligra-plugins. Au moins, c'est vraiment modulaire comme approche (ce qui n'est pas le cas de Libreoffice).

Ici, pour créer un graphique, il faut nécessairement cliquer sur une petite icône, qui ne semble pas marcher à première vue, mais en fait si, mais il faut cliquer dans le tableur une nouvelle fois pour voir apparaître une fenêtre. Celle-ci indique ce que l'on vient de sélectionner (même si ce n'est pas en sur-brillance), je sélectionne First row as label, et OK.

Plus de questions, et le graphique apparaît, en histogramme, pour chaque colonne, et l'ordonnée est Growth in %. Voici un petit aperçu pour la route :

Calligra Sheets par défaut

Il me faut choisir le bon type de graph dans la barre latérale (Scatter), et c'est uniquement une petite icône dans Chart Editing. Le graph est correct, mais rien d'autre n'a changé. À vous de juger :

Calligra Sheets brut

Après pas mal d'efforts, j'obtiens quelque chose d'un peu mieux :

Calligra Sheets linéaire

J'ai pas réussi à bouger la légende, ni à changer la couleur d'arrière plan. En outre, le titre n'a pas bien marché sur plusieurs lignes. La documentation en ligne est un peu pauvre d'ailleurs.

Gnumeric

L'importation du fichier csv se fait par défaut bien, et sans fenêtre du tout.

Insert > Chart présente une fenêtre proche de celle de LO, mais plus simple. Le style par défaut semble assez différent. Je choisi le bon type XY, puis Forward.

Une fenêtre présentant les propriétés de chaque élément du graphique se présente, et c'est assez différent de ce que fait Libreoffice et Calligra. Je ne change rien, et je clique Insert. Rien ne semble se passer, mais en fait, il faut sélectionner une zone pour y indiquer la taille du graphique. Voici le résultat brut :

Gnumeric brut.

Clique-droit sur le graphique, puis Propriétés, et on retrouve la fenêtre précédente pour modifier l'objet que l'on veut. Au moins, c'est consistent.

J'arrive finalement au résultat suivant :

Gnumeric linéaire

À la main numérique

Je connais Python, alors ce sera ça, mais il serait intéressant de voir la même chose avec R.

Voici le code que j'écris pour l'occasion :

#!/usr/bin/env python

if __name__ == '__main__':
    import matplotlib.pyplot as plt
    from matplotlib import style, rcParams
    import pandas as pd

    # Read data
    data = pd.read_csv('population.csv')

    # Linear plot
    plt.figure()
    data.plot(x='Year', y='Population (Hyde 2007)',
              title='Earth Population Over Time (linear)')
    plt.show()

Et voici le résultat obtenu :

Python/Panda brut

Tout est déjà là, mais pour améliorer le style, je rajoute style.use('ggplot'), ce qui donne le résultat suivant :

Panda linéaire

Échelle logarithmique en ordonnée

Pour LO Calc, il faut double-cliquer sur l'axe des ordonnées, et il y a une option pour ça. Le minimum n'est pas super, puisqu'il est à 0 même si les données ne vont pas en dessous du million.

Pour Calligra Sheets, c'est dans Plot area / Scalling…, mais ça semble marche bizarrement.

Pour Gnumeric, c'est dans les propriétés de l'axe Y, sous Scale. Le résultat est propre.

Pour Pandas, il faut ajouter un argument logy=True à la fonction plot.

Je ne vous met que le résultat de Pandas, pour voir un résultat intéressant :

Pandas log

Conclusion et avis personnel

Cette comparaison est tout à fait biaisée, puisque je ne me suis intéressé qu'à un seul type de graphique, et c'est assez particulier. Cependant, il en ressort un sentiment général sur ces applications.

Les expériences que j'ai le plus aimé sont : Pandas, Gnumeric, LibreOffice Calc et Calligra Sheets, et cet ordre est le même en ce qui concerne la qualité de présentation.

Calligra Sheets est le moins intuitif à mon goût, et tends à marcher moins bien (et à planter un peu parfois). Les options sont rangés vraiment bizarrement, et les retours utilisateurs sont de mauvaise qualité.

LibreOffice Calc fait mieux, mais devoir cliquer sur un élément du graphique pour en changer les propriétés, c'est pas une bonne idée (cliquer sur des lignes c'est assez navrant). Certaines options semblent avoir un effet inconnu. Par contre, avoir LO, c'est tous les modules ou rien du tout (enfin, sauf sur Debian, mais ce n'est même pas supporté en amont).

Gnumeric a été une bonne surprise pour moi. L'interface est beaucoup plus cohérente, et une fois habitué à celle-ci, c'est beaucoup plus logique que les deux précédents. Les grilles sur le graphique ne sont pas super, et c'est un peu dommage. Mais il faut le boulot, et plutôt correctement.

Python/Pandas n'est pas forcément comparable, puisque ce n'est pas une machine à clics, mais dans ce cas-là, c'est vraiment simple. Ce n'est peut-être pas pour tout le monde, mais ça fait des graphiques bien plus utiles.

Bref, pour un tableur avec graphiques, je recommanderais Gnumeric ou Pandas (pour un dev. qui connaît déjà Python par exemple). Je ne recommanderais pas Calligra Sheets ni LO Calc pour l'instant.

Vos retours ?

Il serait intéressant de voir ce que donne Microsoft Office, Apple Numbers et R.

P.-S : j'espère que le dernier graphique vous a plût ;)

  • # R

    Posté par . Évalué à 8.

    Sans trop essayer de le rendre beau, voici ce que ça donne dans R (je suis loin d'être un spécialiste de R, j'ai deux faire deux tutos ou un truc comme ça ;-) par contre j'ai vu de jolies images faites par d'autres) :

    data <- read.csv("~/Téléchargements/hum-pop.csv")
    plot(data, type='b', main="Human population")
    plot(data, type='b', log='y', main="Human population (log)")
    

    Version linéaire

    Version logarithmique

    Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.

    • [^] # Re: R

      Posté par (page perso) . Évalué à 4.

      Merci bien !

    • [^] # Re: R

      Posté par (page perso) . Évalué à 3.

      Un utilisateur plus expérimenté de R utiliserait presque certainement le package ggplot2 plutôt que les mécanismes par défaut, qui sont un peu datés. Au niveau UI, ça s'utilise à peu près comme pandas, qui en est fortement inspiré je crois.

      • [^] # Re: R

        Posté par . Évalué à 1.

        Mouais, je n'ai jamais été convaincu par ggplot2, et encore moins par lattice. L'utilisation d'aplats de gris et l'"innovation" graphique font peut-être un peu plus moderne, mais je trouve qu'on y perd énormément en simplicité.

        • [^] # Re: R

          Posté par (page perso) . Évalué à 2.

          Il faut peut-être que tu insistes un peu ? Je suis passé par cette phase aussi, mais autant au niveau de l'expressivité que du rendu, je trouve maintenant que c'est mille fois mieux que le système traditionnel.

        • [^] # Re: R

          Posté par . Évalué à 2.

          Les aplats de gris permettent surtout d’appuyer l’importance des données par rapport aux éléments connexes (axes et grilles). Maintenant, l’apparence de ggplot2 est aisément configurable, et l’installation de base fourni les thèmes classic ou bw qui n’utilisent pas ce gris.

          • [^] # Re: R

            Posté par . Évalué à 6.

            Je ne suis pas fan des aplats gris, mais une fois passé à un autre thème, ggplot2 permet vraiment de faire de beaux graphes assez rapidement (à condition de bien préparer ses données).
            Il y a de bons exemples ici

            Version rapide avec gglot2 sous R.

                library("ggplot2")
            
                data <- read.csv("~/Downloads/hum-pop.csv")
                # On simplifie les noms de colonne (en particulier on élimine les espaces)
                names(data) <- c("Year", "Population")
            
                p <- ggplot(data=data, aes(x=Year, y=Population)) +
                  geom_line() + # on veut une ligne
                  geom_point() + # et les points
                  ggtitle("Human population (Hyde 2007)") +
                  theme_bw() # thème sans aplat gris
                print(p) # on affiche le graphe
            

            Population ggplot

            Puis la version logarithmique:

                # on passe à l'échelle log10 et on reformate un peu l'affichage
                q <- p +
                  scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x),
                                labels = trans_format("log10", math_format(10^.x)))
                print(q)
            

            Population ggplot log

        • [^] # Re: R

          Posté par . Évalué à 3. Dernière modification le 17/05/15 à 23:59.

          Bonsoir,

          J'aimerais noter qu'en R, les systèmes de graphiques diffèrent surtout de par leurs philosophies. Un aperçu sommaire infra, sans prétendre à l'exhaustivité.

          • Le système traditionnel : on dessine (ou ajoute des éléments) sur le graphique courant, il est impossible de modifier quoi que ce soit d'un élément déjà dessiné. C'est le plus connu car venant nativement avec R dès les premières versions ; nous le devons principalement à Ross IHAKA.

          • Le système grid : un modèle informel représente les objets graphiques indépendamment du rendu ; on peut donc mettre à jour ces objets. Les systèmes de coordonnées sont liés à des viewports et non pas à la zone de dessin elle-même, ce qui permet de concevoir des graphiques sophistiqués. Ce système a vu le jour avec la thèse de doctorat de Paul MURRELL ; son principal défaut est le manque de primitives natives pour les graphiques statistiques.

          • Le système lattice ajoute au système grid les idées de William S. CLEVELAND sur les treillis (mathématiques). On a alors une grammaire de graphiques à disposition mais le modèle reste informel.

          • ggplot2 donc : reprise des bonnes idées que présentent tous les systèmes précédents, plus un modèle formel cette fois-ci.

          • Ce n'est pas tout : voir http://cran.r-project.org/web/views/Graphics.html.

          Quant à l'objet de la dépêche, pour reprendre le commentaire de eingrossfilou tout en restant dans le minimalisme souhaité par l'auteur du journal, je proposerais ceci :

          library("ggplot2")
          
          humPop <- read.csv("./hum-pop.csv")
          names(humPop) <- c("Year", "Population")
          
          qplot(x = Year, y = Population, data = humPop, geom = c("point", "smooth"), main = "Earth Population Over Time (linear)")
          
          qplot(x = Year, y = Population, data = humPop, geom = c("point", "smooth"), log = "y", main = "Earth Population Over Time (log)")

          P.S. C'est mon premier commentaire, j'ignore comment téléverser une image sur les serveurs de LinuxFR.

          • [^] # Re: R

            Posté par . Évalué à 3.

            J'ai aussi galérer pour trouver comment téléverser une image.

            La réponse se trouve à la dernière ligne de la section image de l'aide à l'édition.

            L'hébergement de l'image initiale reste à votre charge, elle est en cache sur img : en auto-hébergé, sur pix de toile-libre ou lutim selon votre préférence…

            Je suis passé plusieurs fois à côté sans la voir et j'ai failli être découragé de poster mon commentaire. Je pense qu'il faudrait mettre ce point en évidence (en gras ou en début de section) ou dans une section à part (par exemple téléversement d'image).

            • [^] # Re: R

              Posté par . Évalué à 2.

              Je ne connaissais pas le mot "téléverser" ; je vois qu'il n'est pas encore au dico français, mais il gagne en popularité, et il a déjà un nouvel adepte aujourd'hui :-).

              • [^] # Re: R

                Posté par . Évalué à 1.

                Je trouve ce mot horrible.

          • [^] # Re: R

            Posté par . Évalué à 3. Dernière modification le 18/05/15 à 11:36.

            j'ignore comment téléverser une image sur les serveurs de LinuxFR.

            On ne peut pas. Il faut héberger l’image ailleurs, sur imgur.com par exemple. Ensuite tu peux intégrer cette image à ton commentaire (ou journal ou dépêche) ainsi :

            ![Titre de l'image](http://exemple.com/image.png) 
            

            EDIT : Arf, j’ai lu trop vite la réponse précédente…

          • [^] # Re: R

            Posté par (page perso) . Évalué à 3.

            Bienvenue! Merci pour ce commentaire très instructif.

          • [^] # Re: R

            Posté par . Évalué à 2.

            Merci pour les clarifications et astuces sur le téléversement. Voici donc les sorties du code se trouvant dans mon précédent commentaire :

            Première sortie
            Sans transformation logarithmique

            Deuxième sortie
            Avec transformation logarithmique

          • [^] # Re: R

            Posté par . Évalué à 1.

            En fait, le système traditionnel est très proche de ce qui se trouve dans Gnuplot, non ?

            Du coup, c'est vrai que la partie ggplot me semble très intéressante. Après, LA fonctionnalité de Gnuplot essentielle pour moi, c'est la capacité de sortie en PDF + LaTeX, parce que ça permet d'avoir un rendu quasi-parfait dans un document scientifique. Notamment, on peut bidouiller un peu le truc (convertir le pdf en png pour les plots colorés en 3D, par exemple, même si idéalement je préfèrerais n'avoir que la partie colorée en bitmap et le reste en vectoriel). Le problème c'est qu'il faut aussi se taper des heures de pinaillages sur la mise en page pour arriver à un truc qui bavasse pas dans tous les coins (mettre 3 plots côte à côte peut-être assez proche de la pénitence).
            Est-ce que tu as essayé le driver Tikz pour R, qui a l'air de faire un peu le même travail ? Parce que bénéficier d'un truc plus expressif que Gnuplot tout en gardant un rendu final aussi bon, ça serait un véritable rêve !

            • [^] # Re: R

              Posté par . Évalué à 2.

              Bonjour,
              Concernant Gnuplot, je ne pourrais répondre, quelqu'un d'autre connaissant à la fois R et Gnuplot pourrait t'éclairer.
              Quant à Tikz, on configure les dépendances système de façon adéquate (distribution LaTeX) et après, Tikz sera considéré comme un périphérique de graphique au même titre que les autres (PDF, PNG, JPG, X11, …). Cela est valable quel que soit le système graphique qu'on souhaite utiliser et peu importe les fonctions graphiques qu'on manipule, notamment mettre plusieurs graphiques sur une même zone de rendu. Je reprends le même exemple :

              invisible(sapply(c("ggplot2", "tikzDevice", "grid", "gridExtra"), function(xxx) {
                  library(xxx, character.only = TRUE)
              }))
              
              humPop <- read.csv("./hum-pop.csv")
              names(humPop) <- c("Year", "Population")
              
              humLin <- qplot(x = Year, y = Population, data = humPop, geom = c("point", "smooth"), main = "Linear")
              
              humLog <- qplot(x = Year, y = Population, data = humPop, geom = c("point", "smooth"), log = "y", main = "Logarithmic")
              
              #Les sorties vont dans le périphérique par défaut
              grid.arrange(humLin, humLog, ncol = 2, main = "Earth Population Over Time")
              
              #Nous indiquons le périphérique de destination des sorties
              tikz("plotting_outputs.tex")
              grid.arrange(humLin, humLog, ncol = 2, main = "Earth Population Over Time")
              dev.off()

              La sortie ressemblera à ça :

              Human Population

              Dans le fichier TEX généré, ne pas oublier d'inclure le préambule et l'environnement document, quelque chose du genre :

              \documentclass[10pt]{article}
              
              \usepackage{tikz}
              \usepackage[active,tightpage,psfixbb]{preview}
              \PreviewEnvironment{pgfpicture}
              \setlength\PreviewBorder{0pt}
              \usepackage[T1]{fontenc}
              \usetikzlibrary{calc}
              \batchmode
              
              \begin{document}
              %contenu du fichier généré en R
              \end{document}

              Le mainteneur du binding de Tikz en R est Yihui Xie ; il a écrit d'autres bibliothèques spécialisées dans le traitement de LaTeX, Markdown, HTML et compagnies : voir sa page sur GitHub. En particulier, knitr est un authentique couteau suisse.

              • [^] # Re: R

                Posté par . Évalué à 1.

                Merci pour l'exemple ! Je jetterai un œil la prochaine fois que j'aurai à sortir un graphe.
                Et knitr/Sweave, ça a l'air assez puissant aussi pour tester le bouzin.
                Reste en fait à voir s'il est possible d'avoir des courbes en 3D assez résolues sans que :
                1. ça chie avec l'antialiasing du lecteur PDF
                2. ça soit lourd à mourir
                C'est notamment pour ces deux raisons que le backend idéal de mes rêves permettrait de rasteriser uniquement le bout coloré plein de polygones (dont il est assez peu utile d'avoir une version vectorielle).

            • [^] # Re: R

              Posté par . Évalué à 2.

              As-tu un exemple de ce que tu fais habituellement et que tu aimerais refaire en R ? Si on prend ceci par exemple :

              library("misc3d")
              library("tikzDevice")
              
              tikz("parametric3d.tex", standAlone = TRUE)
              
              parametric3d(fx = function(u,v) u,
                           fy = function(u,v) sin(v)*(u^3+2*u^2-2*u+2)/5,
                           fz = function(u,v) cos(v)*(u^3+2*u^2-2*u+2)/5,
                           umin = -2.3, umax = 1.3, vmin = 0, vmax = 2*pi,
                           scale = FALSE, color = "red", color2 = "blue",
                           material = "shiny", engine = "grid")
              
              dev.off()

              Après compilation du fichier .tex, la résolution est plus que respectable :
              Parametric 3D

              L'image est une capture d'écran de la "partie utile" dans le fichier parametric3d.pdf. Sa taille : 312.2 kB pour 946 x 731 pixels. Le PDF fait 318 kB.

              • [^] # Re: R

                Posté par . Évalué à 2.

                Alors, l'exemple canonique de ce que je veux faire, c'est ça :
                Graphe canonique

                En gros, j'ai un fichier texte qui contient mes données (typiquement du csv où sur chaque ligne tu as les coordonnées x et y, et la valeur en z). Pour que ça soit joli, je dirais que c'est assez souvent du 50x50 ou du 100x100, éventuellement avec un peu d'interpolation si ça suffit pas (là, faut imaginer que le truc c'est du 7cm de large).
                Le vrai problème c'est que selon le moteur de rendu utilisé par le lecteur PDF, ça devient archi-moche si tu gardes tout en vectoriel. Principalement, t'as des lignes blanches qui apparaissent aléatoirement aux jointures entre les différents patches, qui viennent de l'antialiasing visiblement.
                Ce qui sauve l'affaire, c'est que je peux convertir en bitmap, sans antialiasing, la partie graphe (celle qui contient les données, la colorbar, les axes et les contours). En fait, c'est même plus logique de faire comme ça, vu que les données sont essentiellement du bitmap (mais c'est pas parfait, parce que c'est évidemment pas le cas des axes et des contours).

                • [^] # Re: R

                  Posté par . Évalué à 2.

                  On dirait qu'il y a un petit souci avec la partie basse de l'image, à moins que le "découpage" ait été intentionnel.
                  J'ai une vague idée de ton pipeline mais l'idéal serait d'avoir un code qui part de la lecture d'un de tes CSVs jusqu'à la création d'une image ; comme cela, j'essaierai de reproduire le traitement en R. Ou alors, un lien vers quelque chose de semblable sera aussi suffisant.

                • [^] # Re: R

                  Posté par . Évalué à 2.

                  Ce commentaire est un aveu d'incompétence : "Je ne suis pas X".

                  Pas physicien nucléaire. Dans l'incapacité de générer des données de test après avoir regardé les diverses quantités et relations de la Physique, je me suis fait des données bidons, histoire d'illustrer ggplot2. On y va :

                  invisible(sapply(c("ggplot2", "tikzDevice", "gridExtra"), function(xxx) {
                      library(xxx, character.only = TRUE)
                  }))
                  
                  intervals <- seq(-40, 40)
                  celerity <- 299792458
                  hbar <- 1054571726e-34
                  
                  sampleData <- expand.grid(x = intervals, y = intervals)
                  
                  fakeQuantumRadius <- hbar * celerity / exp(sin(sampleData$x) * cos(sampleData$y))
                  sampleData$z1 <- 2 * fakeQuantumRadius
                  sampleData$z2 <- fakeQuantumRadius / 2
                  
                  shapeChar <- 20
                  lowCol <- "chocolate4"
                  highCol <- "yellow"
                  
                  fig1 <- ggplot(sampleData, aes(x, y, colour = z1)) +
                          geom_point(shape = shapeChar) +
                          scale_colour_gradient(low = lowCol, high = highCol, name = "$R = 2R_q$",
                                                label = seq(from = 0, to = 20, by = 5)) +
                          xlab("$\\hbar\\omega / E_B$") +
                          ylab("$\\hbar\\omega_{dc} / E_B$") +
                          theme(panel.background = element_blank(), legend.position = "top")
                  
                  
                  fig2 <- ggplot(sampleData, aes(x, y, colour = z2)) +
                          geom_point(shape = shapeChar) +
                          scale_colour_gradient(low = lowCol, high = highCol, name = "$R = R_q / 2$",
                                                label = seq(from = 1, to = 5)) +
                          xlab("$\\hbar\\omega / E_B$") +
                          theme(panel.background = element_blank(), legend.position = "top",
                                axis.title.y = element_blank(), axis.text.y = element_blank())
                  
                  
                  tikz("exemple_bidon.tex", standAlone = TRUE, width = 8, height = 5.33)
                  grid.arrange(fig1, fig2, ncol = 2)
                  dev.off()

                  Le fichier exemple_bidon.pdf fait 838.8 kB. Avec ImageMagick :

                  convert -density 150 exemple_bidon.pdf -quality 100 exemple_bidon.png

                  RienÀVoirAvecLaPysiqueNucléaire

                  Pas graphiste. Concernant la rasterisation, je me contente de citer quelques bibliothèques en R qui pourraient t'intéresser même si le langage n'est pas vraiment l'outil adéquat pour faire du Traitement d'Image avancé. Les bibliothèques alors : raster, rasterVis, adehabitatMA, Cairo, readbitmap

                  • [^] # Re: R

                    Posté par . Évalué à 3.

                    Pas physicien nucléaire.

                    Moi non plus ! Je joue plutôt dans des conducteurs quantiques. Je te mets les fichiers de donnée là :
                    http://atdot.eu/rphys/

                    Pour ce qui est du pipeline, voilà l'idée :
                    L'histoire commence avec un script gnuplot :

                    set term cairolatex pdf input size 8.4cm,5.0cm
                    set output 'rphys_a.tex'
                    unset key
                    set palette rgb 21,22,23
                    # On met de l'interpolation pour que ce soit joli
                    set pm3d map interpolate 0,0
                    
                    set multiplot
                    set title offset character 0,1.8
                    set xtics 20
                    set ytics 20
                    set xlabel '$\hbar \omega / E_B$'
                    set ylabel '$\hbar \omega_{\mathrm{dc}} / E_B$' offset character -0.5,0
                    set tmargin at screen 0.7
                    set bmargin at screen 0.25
                    
                    set lmargin at screen 0.15
                    set rmargin at screen 0.55
                    set cbtics offset character 0,2
                    set cbtics 5 
                    set colorbox horiz user origin .2,.73 size .3,.03
                    set xtics (-30,-15,0,15, 30)
                    set title '$K = 1/3$'
                    splot 'rphys_a1_K_1_3.dat' with pm3d
                    
                    set lmargin at screen 0.56
                    set rmargin at screen 0.96
                    set colorbox horiz user origin .61,.73
                    set noylabel
                    set ytics format ""
                    set cbtics 1
                    set xtics (-30,-15,0,15, 30)
                    set title '$K = 2/3$'
                    splot 'rphys_a2_K_2_3.dat' with pm3d
                    unset multiplot

                    Gnuplot génère alors deux fichiers : rphys_a.tex à inclure dans le document tex, qui contient les textes et rphys_a.pdf qui contient le reste.

                    Pas graphiste

                    Moi non plus. Je passe juste un coup d'imagemagick sur le pdf :

                    convert +antialias -density 600 rphys_a.pdf rphys_a.png

                    Et pour que ça marche parfaitement, faut changer la ligne "includegraphics" de rphys_a.tex, parce que sinon, ça prend pas la bonne taille, du coup, la ligne qui était :

                    \put(0,0){\includegraphics{figures/rphys_a.png}}%

                    devienne :

                    \put(0,0){\includegraphics[width=8.4cm]{figures/rphys_a.png}}%

                    Et voilà. \o/

                  • [^] # Re: R

                    Posté par . Évalué à 3.

                    Bonjour Sarcastic ,

                    Toutes mes plates pour la période d'hibernation.

                    Sans transition, d'abord, la fonction image (bibliothèque base) peut aider à obtenir des résultats semblables à ceux de Gnuplot. Ensuite, pour des résultats améliorés, on peut voir du côté de la fonction image.plot (bibliothèque fields) ; dans les deux cas, la bibliothèque akima peut accomplir l'interpolation. Puis, si on veut ajouter de la perspective à la visualisation, la bibliothèque misc3d pourra aider. Enfin, à mon avis, ggplot2 est inadéquat pour ce genre de traitement. Foin de verbiage, place au code.

                    • Pre-processing et quelques définitions
                    invisible(sapply(c("akima", "fields", "ggplot2", "gridExtra", "misc3d"), function(xxx) {
                        library(xxx, character.only = TRUE)
                    }))
                    
                    interpoCoord <- function(component) {
                        return(seq(
                            from = min(component),
                            to = max(component),
                            length.out = 2 * length(component)
                        ))
                    }
                    
                    utilFields <- function(interpolated, xText = "", yText = "", legText = "") {
                        image.plot(interpolated, horizontal = TRUE, legend.lab = legText)
                        title(xlab = xText, ylab = yText)
                    }
                    
                    rphys1 <- read.table("rphys_a1_K_1_3.dat", sep = "", quote = "", skipNul = TRUE)
                    rphys2 <- read.table("rphys_a2_K_2_3.dat", sep = "", quote = "", skipNul = TRUE)
                    names(rphys1) <- names(rphys2) <- c("x", "y", "z")
                    
                    rphys1Smooth <- with(rphys1, interp(x = x, y = y, z = z , xo = interpoCoord(x), yo = interpoCoord(y)))
                    rphys2Smooth <- with(rphys2, interp(x = x, y = y, z = z, xo = interpoCoord(x), yo = interpoCoord(y)))
                    
                    imWidthBase <- 800
                    imHeightBase <- 600
                    imWidthFields <- imWidthBase - 350
                    imHeightFields <- imHeightBase - 100
                    
                    shapeChar <- 19
                    shapeSize <- 3
                    lowCol <- "#720808"
                    highCol <- "#ffff00"
                    oddMargins <- unit(c(.01, .01, .01, .2), "cm")
                    evenMargins <- unit(c(.01, .2, .01, .01), "cm")
                    • Bibliothèque base
                    png("rphys1_base.png", width = imWidthBase, height = imHeightBase)
                    image(rphys1Smooth, xlab = absTag, ylab = ordTag)
                    dev.off()
                    
                    png("rphys2_base.png", width = imWidthBase, height = imHeightBase)
                    image(rphys2Smooth, xlab = absTag, ylab = "")
                    dev.off()

                    Avec-base

                    • Bibliothèque fields
                    png("rphys1_fields.png", width = imWidthFields, height = imHeightFields)
                    utilFields(rphys1Smooth)
                    dev.off()
                    
                    png("rphys2_fields.png", width = imWidthFields, height = imHeightFields)
                    utilFields(rphys2Smooth)
                    dev.off()

                    Avec-fields

                    • Bibliothèque misc3d

                    Warning : La projection des perspectives est un traitement très lourd pour ces données !

                    sceneObj1 <- with(rphys1, surfaceTriangles(x, y, z, material = "shiny"))
                    sceneObj2 <- with(rphys2, surfaceTriangles(x, y, z, material = "shiny"))
                    
                    exportScene(sceneObj1, filename = "rphys1_3D", format = "OFF")
                    exportScene(sceneObj2, filename = "rphys2_3D", format = "OFF")
                    
                    drawScene(sceneObj1, engine = "standard")
                    drawScene(sceneObj2, engine = "standard")
                    • Bibliothèque ggplot2
                    fig1 <- ggplot(rphys1, aes(x, y, fill = z)) +
                        geom_raster(interpolate = TRUE) +
                        scale_fill_continuous(low = lowCol, high = highCol, name = "") +
                        xlab("") + ylab("") +
                        theme(legend.position = "top", plot.margin = oddMargins)
                    
                    fig2 <- ggplot(rphys2, aes(x, y, fill = z)) +
                        geom_raster(interpolate = TRUE) +
                        scale_fill_continuous(low = lowCol, high = highCol, name = "") +
                        xlab("") +
                        theme(legend.position = "top", axis.title.y = element_blank(), axis.text.y = element_blank(), plot.margin = evenMargins)
                    
                    fig3 <- ggplot(rphys1, aes(x, y, colour = z)) +
                        geom_point(shape = shapeChar, size = shapeSize) +
                        scale_colour_gradient(low = lowCol, high = highCol, name = "") +
                        xlab("") + ylab("") +
                        theme(legend.position = "top", plot.margin = oddMargins)
                    
                    fig4 <- ggplot(rphys2, aes(x, y, colour = z)) +
                        geom_point(shape = shapeChar, size = shapeSize) +
                        scale_colour_gradient(low = lowCol, high = highCol, name = "") +
                        xlab("") +
                        theme(legend.position = "top", axis.title.y = element_blank(), axis.text.y = element_blank(), plot.margin = evenMargins)
                    
                    grid.arrange(fig1, fig2, ncol = 2, respect = TRUE)
                    grid.arrange(fig3, fig4, ncol = 2, respect = TRUE)

                    Note. À part ceux de ggplot2, le reste des résultats s'interfacent très péniblement avec Tikz. Donc Gnuplot gagne haut la main sur la question de l'interopérabilité avec LaTeX et sur celle de la légèreté+rapidité, modulo mes connaissances très minimes sur Tikz : je suis preneur des propositions de comment éviter des erreurs du genre

                    TeX capacity exceeded, sorry [main memory size=5000000].

                    Oui, j'ai lu des propositions de solutions de ce type mais rien n'y a fait.

                    • [^] # Re: R

                      Posté par . Évalué à 1.

                      Wow, merci ! T'as dû y passer un certain temps !
                      C'est assez joli ce qu'on peut faire. J'espère avoir le temps d'essayer ça d'ici la semaine prochaine. Je te dirai mes trouvailles, notamment si ça me convient !

  • # Libre office - API?

    Posté par . Évalué à 2.

    LibreOffice Calc fait mieux, mais devoir cliquer sur un élément du graphique pour en changer les propriétés, c'est pas une bonne idée (cliquer sur des lignes c'est assez navrant).

    As-tu essayé via l'API? Oui, LibreOffice est une application de type WYSWYG mais elle peut être contrôlée par script. En plus la version 4.x offre un accès Python.

    • [^] # Re: Libre office - API?

      Posté par (page perso) . Évalué à 4.

      Non, mais tu peux essayer ;)

      J'ai plus l'impression que c'est pour développer des extensions à l'origine.

    • [^] # Re: Libre office - API?

      Posté par . Évalué à 6.

      Pas besoin de cliquer sur un élément pour le modifier, une fois le graphique en mode édition il y une barre d'outils avec une liste déroulante des éléments modifiables. Il suffit de choisir puis cliquer sur le bouton juste à coté pour modifier l'objet sélectionné.

  • # Quelle est la question ?

    Posté par . Évalué à 1.

    Hello !

    L'idée étant de voir le résultat par défaut obtenu, puis d'essayer d'améliorer ça, et de conclure.

    [disclaimer: je ne suis la dataviz que de très très loin]

    Quelle est la question à laquelle tu cherche à répondre (ou le problème à représenter) ? Parce qu'en fait, ce n'est peut-être juste pas le bon graphique ?

    Ça ne me semblerait pas déconnant qu'un résultat par "défaut" ne corresponde absolument pas à des besoins concrets.

    • [^] # Re: Quelle est la question ?

      Posté par (page perso) . Évalué à 2.

      Je crois avoir déjà répondu à ça dans le journal :

      Je m'intéresse ici à l'évolution de la population humaine de -10 000 AEC à 2010 EC

      Je souhaite simplement voir comment ça évolue dans le temps. C'est assez simple. J'en ai simplement profité pour voir comment produire un graphique de type XY se fait dans un tableur.

      • [^] # Re: Quelle est la question ?

        Posté par . Évalué à 0.

        Hello !

        Je souhaite simplement voir comment ça évolue dans le temps

        Justement, je pense que le graphique XY est hyper trompeur, même avec un logarithme.

        Il serait peut-être intéressant de voir avec des mini-charts ce qui est explorable, en superposant ça à la courbe globale.

        Encore une fois, je ne suis pas calé en dataviz, mais à mon avis, ton soucis est que l'outil "de base" ne peut pas répondre à la question "de base". C'est pourquoi j'en demandais un peu plus ;)

  • # En javascript

    Posté par (page perso) . Évalué à 4.

    Dans le même style, oumph bosse sur une comparaison des grapheurs javascript, pour un choisir un pour les statistiques de LinuxFr.org. La dépêche est en cours de rédaction. Là aussi, on peut voir qu'il y a beaucoup de solutions, mais rien d'idéal : ça dépend des besoins et du temps que l'on prêt à y consacrer.

    • [^] # Re: En javascript

      Posté par (page perso) . Évalué à 4.

      Ça à l'air de d'avoir pris pas mal de temps tous ces tests en tout cas. Bizarrement, la présentation semble plus sympa que sous LO ou Calligra avec les grapheurs javascripts.

      • [^] # Re: En javascript

        Posté par (page perso) . Évalué à 1. Dernière modification le 17/05/15 à 17:05.

        J'aime bien highcharts (http://www.highcharts.com/) qui permet de faire de très jolie chose très facilement… mais j'imagine que la double licence ne vous plaira pas (faut bien qu'ils mangent c'est brave gens :))

        • [^] # Re: En javascript

          Posté par (page perso) . Évalué à 4.

          faut bien qu'ils mangent c'est brave gens :)

          Il faut que je me mette vraiment à développer du libre, ça permet de ne plus devoir manger visiblement. Est-ce que Stallman peu t confirmer ?

          « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

  • # Et Gnuplot ?

    Posté par . Évalué à 3. Dernière modification le 17/05/15 à 15:27.

    Je suis un un poil surpris que personne ne parle de gnuplot … Je n'en suis pas un expert mais ça rend plutôt bien avec le style w line :

    set xlabel 'Year'
    set title 'Human Population'
    plot 'data.txt' u 1:2 w line title 'Population (Hyde 2007)'
    et on peut ajouter

    set logscale
    

    Human Population with Gnuplot

  • # Graphique "barre" avec python

    Posté par . Évalué à 2.

    Je me suis attaqué aux ventes de l'Iphone par trimestre en Python :vente Iphone

    À partir d'un fichier data.dat de type : Semestre,Chiffre

    #!/usr/bin/env python3
    
    ###galenterie d'usage
    import matplotlib.pyplot as plt
    import numpy as np
    
    ####lecture donnees
    with open("data.dat", "r") as f:
        donnees = f.readlines()
    
        million = []
        trimestre = []
        for ligne in donnees[1:]:
            txt = ligne.split(",")      
            million.append(txt[1])
            trimestre.append(txt[0])
    
    ####passage vers matplotlib/numpy
    million = np.array(million)
    million = million.astype(np.float)
    
    ####calcul du cumul
    millionc = np.zeros(len(million))
    millionc[0]=million[0]
    
    for i in range(1,len(donnees)-1):
        millionc[i] = millionc[i-1]+million[i]
    
    ####graphique
    x = np.arange(len(million))
    
    rects1=plt.bar(x, millionc, width=1 , align='center')
    rects2=plt.bar(x, million, width=1 , align='center', color='red')
    plt.xticks( x , (trimestre))
    plt.xlabel('Mois')
    plt.ylabel('Millions')
    plt.title('Ventes de l\'Iphone')
    
    def autolabel(rects):
        # legendes
        for rect in rects:
            height = rect.get_height()
            plt.text(rect.get_x()+rect.get_width()/2., 1.0*height, '%d'%int(height),
                    ha='center', va='bottom')
    
    autolabel(rects1)
    autolabel(rects2)
    
    plt.legend( (rects1[0], rects2[0]), ('Ventes cumulées', 'Ventes mensuelles'),loc = 2 )
    
    plt.show()

    Si quelqu'un a une idée pour avoir une légende visible …

  • # pygal

    Posté par . Évalué à 3.

    J'aurais de base pris R ou python avec pygal (je ne connais pas panda).

    with open('fichier.csv') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=',')
        data=[(int(row[0]), int(row[1])) for row in spamreader]
    xy_chart = pygal.XY()
    xy_chart.title = 'Human population (linear)'
    xy_chart.add('Population (Hyde 2007)', intdata[1:])
    xy_chart.render_to_file('fichier.svg')

    Et voila : http://imgh.us/fichier.svg

    Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

    • [^] # Re: pygal

      Posté par . Évalué à 3.

      J'ai oublié de dire qu'il ne permet pas d'avoir une échelle logarithmique en abscisse : https://github.com/Kozea/pygal/issues/84

      Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

    • [^] # Re: pygal

      Posté par (page perso) . Évalué à 2.

      C'est quand même assez illisible : regarde les valeurs en abscisse et en ordonnée, la légende est tronquée.

      L'avantage de Pandas/R, c'est que le fichier csv est parsé pour toi en 1 ligne.

  • # xkcd

    Posté par (page perso) . Évalué à 9.

  • # PyQWT

    Posté par . Évalué à 2. Dernière modification le 18/05/15 à 00:18.

    Quelques autres outils qui pourraient être appropriés pour la tâche ?

    • PyQWT (c'est le premier auquel j'ai pensé en lisant le journal)
    • Scilab (qui a bien évolué depuis l'époque où je m'en servais en école…)
    • QTIplot (et assimilés) ?
    • (et en fait, je découvre qu'il existe une page Wikipedia recensant une pléthore d'autres outils !)
  • # Metapost

    Posté par (page perso) . Évalué à 3.

    J'utilise toujours Metapost, le rendu est très professionnel:

    Image

    Les étiquettes en notation scientifique sont ajoutées automatiquement, et on peut bien-sûr utiliser un échelle logarithmique, ou toute autre échelle qu'on pourrait vouloir programmer.

  • # Finalement, les tableurs, ça sert à quoi ?

    Posté par (page perso) . Évalué à 3.

    Je m'attendais vraiment à ce que quelqu'un montre le résultat d'un autre tableur, mais apparemment, les outils à scripts ont plus la côte.

    Dans ce journal, je voulais aussi que les gens voient que l'ergonomie de ces logiciels pour faire des graphiques est vraiment moyenne : c'est à se demander si les tableurs ne servent pas à faire des graphiques du tout.

    Pourtant, en entreprise, le pourcentage de gens qui font leurs graphiques avec un tableur sont pléthores.

    Je me disais donc, que si tant de gens font des graphiques comme ça, c'est que ça doit être pas trop compliqué, et bien fait. Mais je ne trouve pas que ce soit le cas, sauf sur Gnumeric.

    À quoi servent les tableurs finalement ? Je trouve ça plus simple est puissant de travailler avec des matrices de valeurs avec des logiciels dédiés (comme R), où y faire des graphiques n'est pas si compliqué.

    Les suites libres de bureautiques doivent-elles continuer à maintenir leurs tableurs / graphiques ?

    Peut-être que c'est le même propos que word VS Latex pour les tableurs :)

    • [^] # Re: Finalement, les tableurs, ça sert à quoi ?

      Posté par . Évalué à 7.

      Le tableur? En général c'est un élément d'une suite logicielle "généraliste " qui fait aussi du "traitement de texte", des présentations, de la messagerie, etc …

      L'intéret du tableur est d'être intégré dans ces outils, d'avoir un seul point d'entrée pour les applis et une relaitive uniformisation de ce type de document.

      Maintenant un tableur, c'est comme n'importe quel outil plus ou moins généraliste : ça permet de faire des trucs qui resssemblent à quelque chose relativement vite lorsque le besoin est assez simple, mais ça ne permet pas d'être vraiment efficace pour des choses un peu plus sophistiquées, ou si on veut un graphisme un peu meilleur (on peut faire la même comparaison avec LaTeX et Libreoffice ou Word par exemple).

    • [^] # Re: Finalement, les tableurs, ça sert à quoi ?

      Posté par . Évalué à 2.

      Je m'attendais vraiment à ce que quelqu'un montre le résultat d'un autre tableur

      J'attendais un utilisateur d'Excel, il est pas venu. ;)

      Je fais relativement peu de graphique en général. Sur Excel, je trouve ça anti ergonomique et laid. On arrive à s'en sortir mais il faut lutter.
      Très ressemblant à la description de LibreOffice, sur ce domaine.

      Je suis effectivement d'accord avec toi pour Gnumeric : je l'utilise pour mon usage personnel lorsque j'ai besoin d'un graphique. Plus simple à faire et meilleur résultat.
      L'export du graphique produit est également aisé, dans un format standard (de mémoire, au moins svg et png).

    • [^] # Re: Finalement, les tableurs, ça sert à quoi ?

      Posté par . Évalué à 8.

      Je m'attendais vraiment à ce que quelqu'un montre le résultat d'un autre tableur, mais apparemment, les outils à scripts ont plus la côte.

      Pour cet exemple là parce que ton test est complètement biaisé, il ne porte que sur une courbe f(x) triviale dont les données sont stockées dans un pauvre fichier texte à 2 colonnes.
      Un tableur ça sert d'abord à faire des calculs, extraire des données de différents tableaux, les recombiner en utilisant des formules de calcul plus ou moins complexes, et finalement, éventuellement, produire des vues graphiques de différents types. Et bien sûr garder dans un seul document, les données, les formules de traitement et les graphiques associés. Avec mise à jour automatique des résultats de calcul et des graphiques quand les données sont modifiées (valeurs changées, données ajoutées ou supprimées).

    • [^] # Re: Finalement, les tableurs, ça sert à quoi ?

      Posté par . Évalué à 6.

      Pour moi le tableur c'est le couteau suisse de la donnée,

      On sait qu'on va en trouver un sur la machine où on est connecté, on peut pas faire grand chose avec, mais ca permet d'assurer le service minimum vite fait/bien fait. par exemple un plot X,Y ou un calcul de moyenne/mediane/écart-type.

      Par contre dès qu'on veut faire des traitement un peu avancé : Filtrage, multi-plot, recherche de pics ou d'outliers etc… le tableur n'est pas un outil adapté (même si certains font avec) et il vaut mieux écrire directement du code (Python, R, Matlab, C++, Julia ou n'importe quel framework scientifique)

    • [^] # Re: Finalement, les tableurs, ça sert à quoi ?

      Posté par (page perso) . Évalué à 5.

      Je me disais donc, que si tant de gens font des graphiques comme ça, c'est que ça doit être pas trop compliqué, et bien fait.

      C'est surtout que c'est ce que les élèves apprennent à l'école: traitement de texte / tableur (pour ne pas citer de marque…).

      Donc après ils utilisent par défaut ce qu'ils ont appris.

      Python 3 - Apprendre à programmer en Python avec PyZo et Jupyter Notebook → https://www.dunod.com/sciences-techniques/python-3

      • [^] # Re: Finalement, les tableurs, ça sert à quoi ?

        Posté par . Évalué à 3. Dernière modification le 19/05/15 à 13:28.

        C'est surtout que c'est ce que les élèves apprennent à l'école: traitement de texte / tableur

        À l'école il est particulièrement important de faire aussi tracer des courbes « à la main » (comprendre papier millimétré - crayon). Ça m'a d'ailleurs amusé de lire l'expression « à la main » dans le journal pour voir ce que cela signifiait pour l'auteur et les commentateurs.

        Le tracé manuel permet de comprendre convenablement la notion d'échelle et même d’appréhender celle d'incertitude et de précision : le calcul ou la mesure donne un point à placer à 50,42 mm, la mine de crayon en fait déjà 0,5 et la droite de régression – tracée « à l’œil cette fois-ci » – passe à 5 mm de certains points.

        Je parle ici de collégiens et de lycéens mais un prof de chimie me disait il y a quelques années qu'il imposait sur une année de TP au moins une courbe tracée ainsi.

        • [^] # Re: Finalement, les tableurs, ça sert à quoi ?

          Posté par (page perso) . Évalué à 2.

          J'ai bien parlé du tracé à la main à l'école (papier millimétré linéaire, semi-log, et log-log). J'ai ensuite dit « à la main numérique », je trouvais ça marrant.

          Néanmoins, je suis tout à fait d'accord qu'il faut savoir tracer des courbes à la main sur papier, car c'est très formateur. Même si au collège/lycée, la droite de régression c'est un peu du pipeau, puisqu'on la trace souvent à vu, au lieu d'en calculer la valeur par une méthode genre celle de la médiane de médianes (qui permet de ne pas apporter trop de statistiques au début).

          Bon, mais de manière générale, à la main il est plus simple de faire une ébauche de courbe, et d'obtenir un rendu propre en numérique. C'est le meilleur des deux mondes ;)

  • # Grilles de gnumeric

    Posté par (page perso) . Évalué à 1.

    Les grilles sur le graphique ne sont pas super, et c'est un peu dommage. Mais il faut le boulot, et plutôt correctement.

    Peux-tu préciser ce qui ne va pas avec les grilles, histoire de voir si cela peut être amélioré ? Merci

    • [^] # Re: Grilles de gnumeric

      Posté par (page perso) . Évalué à 2.

      Oui, bien sûr. Par grilles, je parlais de l'arrière plan gris du graphique.

      Si tu créé un graph, sous « Backpane1 », tu peux choisir de quelle manière s'effectue le remplissage. Dans le type « pattern », tu peux choisir pleins de grilles, mais elles sont hyper serrées. Si tu regarde la capture d'écran faite avec Pandas, par exemple, tu peux voir une petite grille blanche pour les valeurs principales.

      Je ne sais pas si ces grilles-là sont trop serrées par défaut, ou alors c'est à cause de mon écran qui est à « dpi = 192 ».

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.