Hvordan lage betinget plotting med Gnuplot

For et par måneder siden viste jeg på denne bloggen en av grunnene til at jeg liker kommandolinjeplanleggingsverktøyet Gnuplot: dens evne til å forstå og vise på en veldig lesbar måte tidsbasert data. Denne uken skal jeg bruke noen få ord på å introdusere en annen Gnuplot-funksjon som gjør det til et viktig verktøy for alle som trenger automatisk, men fleksibel plotting.

Som du sikkert allerede vet, kan Gnuplot plotte både matematiske funksjoner og tabelldata fra ASCII-filer. Hvis du for eksempel har disse tallene i en fil som heter simpledata.txt:

 1 -3 15 
 2 -2 14 
 3 -1, 5 10 
 4 3 -9, 5 
 5 2, 75 -2, 58 

Følgende kommando:

 plott 1: 5 : "simpledata.txt" ved bruk av 1: 2 wlt "2. kolonne med datafil", -2 * (cos (3 * x) * x) +1 wl 
genererer diagrammet i figur A.

Figur A

I det plottet tegnes leselinjen sammen med punktene som er definert av de to første kolonnene i filen: det første tallet på hver rad blir den horisontale koordinaten x, og den andre den vertikale, y. Den grønne kurven er i stedet den grafiske representasjonen av funksjonen -2 * (cos (3 * x) * x) +1 .

Figur A viser den enkleste typen grafer som Gnuplot kan tegne. Så kule som de er, de er også slags stive. Når du har skrevet noe som å "bruke 1: 2", vil den tilsvarende kurven på grafen (den røde i figur A) bruke alt innholdet i disse kolonnene ... og ingenting annet, for hele plottet. Av samme grunn vil den grønne kurven alltid og bare vise banen til den ene funksjonen.

Heldigvis kan Gnuplot være mye mer fleksibel enn dette, takket være betinget plotting . Figur B viser hvordan forrige diagram endres hvis du modifiserer Gnuplot-kommandoen ovenfor som følger:
 plott 1: 5 : "simpledata.txt" ved bruk av 1: ($ 1 <= 3? $ 2: 1/0) wlt "2. kolonne med datafil", (x> 3)? -2 * (cos (3 * x) * x) +1: 1/0 wl 

Figur B

Trikset er alt i betingede, C-lignende uttalelser. Du må plassere dem rett på stedene der du forteller Gnuplot hvilke kolonner (eller funksjoner) som skal brukes som koordinater for den vertikale aksen. "1/0" er et Gnuplot-nøkkelord for å si "ingenting." I dette kodestykket:

 ($ 1 <= 3? $ 2: 1/0) 

Det betyr "hvis det gjeldende tallet i den første kolonnen ($ 1) er mindre enn 3, bruk den andre kolonnen ($ 2), ellers tegner ingenting" . Tilsvarende forteller den andre tilstanden Gnuplot å tegne den tilhørende funksjonen bare for verdier på x større enn 3.

Dette er det grunnleggende Gnuplot betingede plotting-trikset. Selvfølgelig kan de betingede uttalelsene nestes. I praksis kan du bruke dem på flere måter. Ved å kombinere to eller flere matematiske funksjoner, uttrykt med formler, i den ene kurven i figur C er det raskt:

gnuplot> plot 1: 5 : (x <3)? -2 * (cos (3 * x) * x) +1: (x> = 3 && x <4)? -7 * brunfarge (30 * x): 3 * x ** 3 wlt "En kurve laget av 3 formler"

Figur C

Syntaksen for betinget plotting av tabelldata er nesten identisk. Figur D plotter kolonne 2 til x er lik eller større som 3, og bytter deretter til kolonne 3:
 plott 1: 5 : "simpledata.txt" ved bruk av 1: (($ 1 <= 3)? $ 2: $ 3) wlt "2 kolonner med den samme datafilen" 

Figur D

Hva om du ville kombinere i en kurve, ved å bruke dette trikset, tall fra to forskjellige datafiler, eller fra en datafil og en funksjon? Når vi ser på figur B igjen, viser vi at vi trenger noe mer for at resultatet skal vises som en kurve. Nemlig, vi bør fortelle Gnuplot om alltid å bruke den samme fargen for de to tomtene, ved å legge til hver instruksjon alternativet lt N, hvor N er den numeriske koden Gnuplot for plottfarger. For å vite hvilken farge som tilsvarer hver verdi, skriver du "test" ved Gnuplot-ledeteksten.

Det er en annen sak du må ta hensyn til når du spiller med betinget plotting. Du kan se hva jeg snakker om ved å sammenligne figur C med figur E, som jeg genererte plotting av bare 2.9: 4.1 - 20: 400 -området for å gjøre diagrammet mer leselig:

gnuplot> plot 2.9: 4.1 - 20: 200 -2 * (cos (3 * x) * x) +1 wlt "First curve", -7 * tan (30 * x) wlt "Second curve", 3 * x ** 3 wlt "Tredje kurve"

Figur E

Figur E inneholder tre tydelige kurver. Hver av dem tilsvarer en, og bare en av de tre funksjonene som i figur C ble kombinert i en enkelt linje. Hvis vi sammenligner de to diagrammer, vil vi umiddelbart se at disse funksjonene ikke har de samme verdiene i punktene der vi bytter fra hverandre.

Hva skjedde? Det er enkelt: når Gnuplot kommer til skiftende punkter (x = 3 og x = 4 i vårt tilfelle) legger det til ekstra rette segmenter, som forbinder den siste y-verdien til en funksjon med den første y-verdien til den neste.

Du trenger bare å vite dette på forhånd, for å få Gnuplot til å plotte nøyaktig hva du vil. Hvis og når du faktisk vil tegne to adskilte kurver, må du eksplisitt fortelle dette til Gnuplot. Når det er tilfelle, bruk to betingede kontroller:

 gnuplot> plot 3.9: 4.1 : (x <4)? -7 * brunfarge (30 * x): 1/0, (x <4)? 1/0: 3 * x ** 3 vl 

Dette forteller Gnuplot å tegne to uavhengige kurver.

© Copyright 2021 | mobilegn.com