Forum Programmation.autre Gnuplot : heure en fonction du jour ?

Posté par  .
Étiquettes :
0
9
jan.
2006
Bonjour,

J'ai des données dans un fichier texte sous la forme suivante :

# Date   Temps  T6   H6   T4   H4
03/01/05 09:30 19.5 27.0 22.5 23.0
04/01/05 11:41 19.6 28.0 22.3 24.0
10/01/05 09:30 18.7 40.0 22.2 22.0


Pour afficher T6 (3ème colonne) en fonction de la date, avec Gnuplot, il n'y a pas de problème ("plot 'th.txt' using 1:3 notitle with lines" en ayant défini l'axe des x comme une date).

Maintenant, je souhaiterais afficher le temps (colonne 2) en fonction de la date (colonne 1). J'essaye ceci mais çà ne fonctionne pas :

set term png small
set xdata time
set timefmt "%d/%m/%y"
set format x "%d/%m"
set ydata time
set timefmt "%H:%M"
set format y "%H:%M"
set xrange ["01/01/05":"31/12/05"]
set missing 'NaN'
set out "th05-date.png"
set title "Time of measurement - 2005"
set xlabel "Days"
set ylabel "Time"
set autoscale y
plot 'th.txt' using 1:2 notitle with lines
reset


En cherchant un peu sur internet, je suis tombé sur cette page (http://www.lsw.uni-heidelberg.de/manuals/gnuplot/gnuplot.htm(...) ) qui dit explicitement qu'il est impossible d'avoir deux axes différents de temps ("Since only one input format can be in force at a given time, all time/date quantities being input at the same time must be presented in the same format. Thus if both x and y data in a file are time/date, they must be in the same format").

La question est : est-ce que quelqu'un n'aurait quand même pas une astuce pour afficher, dans Gnuplot, une heure en fonction d'un jour ? (colonne 2 en fonction de la colonne 1)

A la limite, je veux bien changer de programme mais j'ai un impératif : il faut que ce soit en ligne de commande (donc pas Gnumeric ni OpenOffice.org Calc, etc.).

Merci d'avance !
  • # TEST OK

    Posté par  . Évalué à 1.

    Salut Je viens de tester: ca marche avec les commandes que tu as passés.(copier coler).

    gnuplot 4.0 patchlevel 0
    Paquet debian: gnuplot 4.0.0-2
    Cela me sort un beau graphique.
  • # Cà marche mais ...

    Posté par  . Évalué à 1.

    Je me suis mal exprimé. Il n'y a pas de bug dans le script que j'ai écrit dans le sens où Gnuplot accepte toutes les commandes et sort un graphique. Mais le graphique ne correspond pas à ce que je lui ai entré comme directives :

    - l'axe des x va du +/- 0/1/2005 (?) au 3/1/2005 (?)
    - il y a des grandes "barres" horizontale dans tout le tracé alors que les données sont séquentielles (voir http://jepoirrier.free.fr/graphs/th05-date.png )

    Pour mesurer l'ampleur de l'ensemble, voici :
    - le fichier de données : http://jepoirrier.free.fr/graphs/th.txt
    - le script : http://jepoirrier.free.fr/graphs/th05-date.inc (lancer "gnuplot th05-date.inc")
    - le graphique résultant, donc : http://jepoirrier.free.fr/graphs/th05-date.png

    Donc, Gnuplot affiche bien quelque chose mais ce n'est pas tout à fait ce que j'attendais ...
    • [^] # Re: Cà marche mais ...

      Posté par  . Évalué à 2.

      Je manque de temps pour faire un test avec ton fichier de données et pondre un script qui va bien, alors je ne te dirais que ce qui suit.
      As-tu essayé jpgraph ( http://www.aditus.nu/jpgraph/ )
      Ca fonctionne plutôt bien, mais il faut utiliser php.
      Ca ne nécessite pas nécessairement de serveur apache, ou autres et fonctionne bien en ligne de commande.
      Voilà, si j'ai du temps prochainement, je ferais un test....
      D'ailleurs, pour mon application de pointage, je l'utilise pour afficher un graph des heures réalisées par semaine, ce qui correspond à peu près à ce que tu veux.
      En espérant que ce commentaire sera utile.
  • # Tu as trouvé toi-même la réponse !

    Posté par  . Évalué à 2.

    L'information que tu as trouvé sur le web concernant l'impossibilité d'utiliser plusieurs formats de temps différents est à la fois la source et la clé du problème.

    La version de développement (en cvs) de gnuplot donne l'indication suivante concernant les formats d'heure et date :


    Internally all times and dates are converted to the number of seconds from the year 2000. The command set timefmt defines the format for all inputs: data files, ranges, tics, label positions---in short, anything that accepts a data value must receive it in this format. Since only one input format can be in force at a given time, all time/date quantities being input at the same time must be presented in the same format. Thus if both x and y data in a file are time/date, they must be in the same format.


    Ainsi, il faut que tu t'arranges pour que tes données heure/date soient toutes dans le même format. En pratique, ça donne ça :

    Le fichier de données original :

    # Date Time T6 H6 T4 H4
    03/01/05 09:30 19.5 27.0 22.5 23.0
    04/01/05 11:41 19.6 28.0 22.3 24.0
    10/01/05 09:30 18.7 40.0 22.2 22.0
    ...


    Il doit s'écrire :

    # Date Time T6 H6 T4 H4
    03/01/05_00:00 01/01/05_09:30 19.5 27.0 22.5 23.0
    04/01/05_00:00 01/01/05_11:41 19.6 28.0 22.3 24.0
    10/01/05_00:00 01/01/05_09:30 18.7 40.0 22.2 22.0
    ...


    Ca prend trois secondes avec un éditeur de texte, où tu remplaces "/05 " par "/05_00:00 01/01/05". Ainsi, les deux colonnes sont dans le même format.

    Pourquoi mettre toute la deuxième colonne à la même date ? Parce que ce qui t'intéresse, c'est justement l'heure, mais que gnuplot prend en compte la donnée d'ensemble heure+date. (La commande 'set format ...' n'influe que sur la façon dont les échelles sont affichées en abscisse et ordonnée, les 'labels').

    A quoi doit ressembler ton fichier de script ?
    Pratiquement inchangé, à ceci près que tu n'appelles qu'une fois "set timefmt ...". J'ai utilisé le script suivant :


    set xdata time
    set ydata time

    set timefmt "%d/%m/%y_%H:%M"

    set xrange ["01/01/05_00:00":"31/12/05_00:00"]

    set format x "%d/%m"
    set format y "%H:%M"

    set missing 'NaN'

    set title "Time of measurement - 2005"
    set xlabel "Days"
    set ylabel "Time"
    set autoscale y
    plot 'th.txt' using 1:2 notitle with lines


    et j'obtiens le résultat attendu : http://tipote.free.fr/time.png

    En conclusion, gnuplot, c'est formidable !
    • [^] # Re: Tu as trouvé toi-même la réponse !

      Posté par  . Évalué à 1.

      Merci pour toutes les réponses. J'ai finalement choisi la dernière solution parce que çà marche bien sans trop déranger ma paresse.

      Le problème que j'ai eu alors est que, comme je dois entrer les données chaque jour, je n'ai pas envie (cfr. la paresse ci-dessus) de taper les "caractères inutiles" : "_00:00 01/01/05_" entre la date et la température. Je continue donc à entrer le date et l'heure normalement. Puis, j'exécute le script Perl ci-dessous pour créer un nouveau fichier de données, insérer ce qu'il faut où il faut et créer le graphique adéquat avec Gnuplot. Voici le script (TIMTOWTDI) :

      -----8<-----
      $file1 = "th.txt"; # original file with format "DD/MM/YY HH:MM"
      $file2 = "th.txt2"; # target file with format "DD/MM/YY_00:00 01/01/06_HH:MM"

      # open the files
      open FILE1, "$file1"
      or die "Cannot open $file1.\n";

      open FILE2, ">$file2"
      or die "Cannot open $file2\n";

      # parse lines from $file1 and save them in $file2
      while(!eof(FILE1))
      {
      $line = ;
      $linedate = substr($line, 0, 8);
      $linedate = $linedate . "_00:00 01/01/06_";
      $therest = substr($line, -26);
      $line = "$linedate$therest";
      print FILE2 "$line";
      }

      # close files
      close FILE1;
      close FILE2;

      # open pipe for Gnuplot
      open(PLOT, "| gnuplot")
      or die "Impossible to launch gnuplot\n";

      print PLOT qq{set term png small\n};
      print PLOT qq{set xdata time\n};
      print PLOT qq{set ydata time\n};
      print PLOT qq{set timefmt "\%d/\%m/\%y_\%H:\%M"\n};
      print PLOT qq{set format x "\%m/\%y"\n};
      print PLOT qq{set format y "\%H:\%M"\n};
      print PLOT qq{set xrange ["01/01/03_00:00":"31/08/06_00:00"]\n};
      print PLOT qq{set missing 'NaN'\n};
      print PLOT qq{set out "th-hour.png"\n};
      print PLOT qq{set title "Time of measurement, 2003 - 2006"\n};
      print PLOT qq{set xlabel "Month/Year"\n};
      print PLOT qq{set ylabel "Time (hour:minute)"\n};
      print PLOT qq{set autoscale y\n};
      print PLOT qq{plot 'th.txt2' using 1:2 notitle with lines\n};
      print PLOT qq{reset\n};
      close PLOT;
      -----8<-----

      - Un exemple de résultat : http://jepoirrier.free.fr/graphs/th-hour.png (sur pratiquement 3 ans)
      - Le script : http://jepoirrier.free.fr/graphs/th-hour.pl

Suivre le flux des commentaires

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