Hvordan håndtere tidsbaserte data med Gnuplot

Gnuplot er, etter min mening, et av de beste open source-verktøyene for å plotte diagrammer på Linux. Jeg liker det fordi:

  • det er et kommandolinjeverktøy
  • den gjenkjenner kommandoer som er ren tekststrenger
  • den leser tallene i ren tekstformat, fra ren tekstfiler

Med andre ord, jeg liker Gnuplot fordi det gjør automatisk kartoppretting så enkelt som mulig: du kan generere både data og Gnuplot-kommandoer på farten med hvilket program eller hvilket programmeringsspråk du liker best, og deretter gi dem videre til Gnuplot.

Med unntaket (med mindre du bruker noen triks) av kakediagrammer, kan Gnuplot plotte praktisk talt alle slags diagram ... hvis du vet hvilke alternativer du skal bruke. Her vil jeg i detalj forklare bare de lite kjente som lar Gnuplot gjenkjenne visse strenger som absolutte datoer eller timer, og følgelig plotte tidsrelaterte data ordentlig.

La oss anta at du har en datafil ("datafile.dat") som denne:

20110101 30

20110108 21

20110115 28

20110122 3

20110129 6

20110205 9

20110212 12

20110219 25

20110226 22

20110305 18

20110312 37

20110319 37

20110326 32

20110402 41

20110409 35

20110416 26

20110423 27.

20110430 20

Et menneske vil umiddelbart forstå at tallene i de første kolonnene er, veldig sannsynlig, datoer. Gnuplot, i stedet, vil ikke. Ikke av seg selv, i hvert fall. Hvis du bare ber deg om å plotte filen med disse instruksjonene:

 sett terminal png størrelse 900, 300 
 sett output "chart_1.png" 
 plot : : 'datafile.dat' bruker 1: 2-tittelen "Dette er hva du får når gnuplot ikke gjenkjenner tidsverdier" med linjer 
det vil si at ved å bruke den første kolonnen for X-aksen og den andre for Y-en, får du diagrammet i figur A : "20110101" er ikke anerkjent som "1. januar 2011", men som "tjue millioner noe. .. "Skikkelig stygt og uleselig, er det ikke?

Figur A

Løsningen er å stille inn xdata- og timefmt-variablene til Gnuplot, ved å legge til disse kommandoene rett før plotinstruksjonen:

 angi xdata-tid 
 angi tidsmasse "% Y% m% d" 

Den første forteller Gnuplot at tallene som går på X-aksen er tidsverdier. Det andre forklarer hvordan de er formatert. I vårt eksempel er formatet ÅÅÅÅMMDD, men det kan ha mange andre verdier, alt beskrevet i dokumentasjonen (mer om dette senere). I praksis er det bare to begrensninger her. Den første er at bare ett inndataformat for tid / dato per plot støttes. Det andre er at for å la Gnuplot håndtere uten problemer ganger verdier som inneholder mellomrom, for eksempel "2011/06/02 11:18", må kolonnene i datafilen skilles med faner i stedet for mellomrom når slike strenger er til stede.

Tilbake til planlegging nå. Kjør Gnuplot med de nyeste innstillingene og se! tallene i den første kolonnen blir gjenkjent for hva de er og trykt deretter, som i figur B.

Figur B

Mye bedre nå, er det ikke? Vi kan imidlertid gjøre det enda bedre. Heldigvis er tidsverdiene formatert i datafilen og måten de skal skrives ut på plottet på helt uavhengige. Timefmt-variabelen som vi allerede har sett, spesifiserer hvordan du skal lese tidskolonnen i datafilen. Timefmt gjenkjenner mange formater:% j indikerer for eksempel dagen i året i 1- 365-formatet, og% B månedsnavnet (på engelsk!). Hvis du vil lese om alle mulighetene til timefmt, skriver du gnuplot i en terminal og deretter hjelper deg med å stille inn timefmt .

Den andre tingen du trenger å vite for å plotte lesbare tidsbaserte diagrammer, er hvordan du plotter omfang og viser tics på tidsaksen for å vise akkurat hva du, ikke Gnuplot, synes er relevant.

Hvis du bare vil plotte et bestemt utvalg av verdier fra datafilen, spesifiser det ved å stille inn xrange med samme format som brukes av timefmt, det er det i den opprinnelige datafilen:

 sett xrange "20110402": "20110430" 
Slik plotter du et "begrenset" diagram som i figur C.

Figur C

Innstillingsnummer, posisjoner og navn på tics er litt mer komplisert, men ikke så mye. Navnene settes enten ved å liste dem eksplisitt, eller tilordne et format til xtics-variabelen. Dette, for eksempel:

 angi xtics-format "% b% d" 
betyr at Gnuplot bør bruke det forkortede månedsnavnet (% b) og dagen i måneden (/% d) for å skrive ut tics som "20. januar", "11. mars" og så videre. Posisjon og antall tics kan kontrolleres på flere måter. Den mest fleksible er å tilordne xtics en start- og sluttverdi, pluss antall sekunder mellom to påfølgende tics. La oss for eksempel anta at vi ønsker å vise en tic annenhver uke, på onsdager. Siden den første onsdagen i 2011 var 5. januar og det er 60x60x24x7x2 = 1209600 sekunder på to uker, kan du plotte det du ser i figur D :
 sett rutenett 
 angi xtics-format "% b% d" 
 sett xtics "20110105", 1209600, "20110430" 

Figur D

Kult, ikke sant? Vær oppmerksom på at "sett rutenett" ikke var nødvendig; det gjør det bare lettere å se at tics vises akkurat der de skal. Det eneste gotcha her er å huske at du må spesifisere start- og sluttopptak i formatet de vises i kildefilen ("20110105"), ikke den som er vist i plottet ("05. januar").

Oppsummering

Diagrammer over tidsbaserte data er svært nyttige på mange måter for arbeid og studier. Her har jeg forklart alt du sannsynligvis trenger å vite for å bruke Gnuplot for å gi mening om slike data. I tilfelle det ikke er nok, kan du finne enda mer informasjon i Gnuplot-dokumentasjonen ved å skrive inn hjelptid / dato eller hjelp til å angi xtics på spørsmål.

© Copyright 2020 | mobilegn.com