2013-02-21 15 views
6

Czy istnieje sposób na wykreślenie funkcji opartej na wartościach z pliku tekstowego?Wykreślanie funkcji bezpośrednio z pliku tekstowego

Wiem, jak zdefiniować funkcję w gnuplot, a następnie narysuj ją, ale to nie jest to, czego potrzebuję. Mam tabelę ze stałymi dla funkcji, które są regularnie aktualizowane. Kiedy nastąpi ta aktualizacja, chcę móc uruchomić skrypt, który rysuje figurę z tą nową krzywą. Ponieważ istnieje niewiele liczb do narysowania, chcę zautomatyzować procedurę.

Oto przykład stół ze stałych:

location a b c 
1  1 3 4 
2 

Istnieją dwa sposoby widzę, aby rozwiązać problem, ale nie wiem, czy i w jaki sposób mogą być realizowane.

  1. mogę następnie użyć awk produkować ciąg: f(x)=1(x)**2+3(x)+4, zapisz go do pliku i jakoś gnuplot przeczytać ten nowy plik i działki na pewnej x zakresie.
  2. lub użyj awk wewnątrz gnuplot coś jak f(x) = awk /1/ {print "f(x)="$2 itp, lub użyj awk bezpośrednio w komendzie fabuły.

W każdym przypadku, utknąłem i nie znalazłem rozwiązania tego problemu w Internecie, czy masz jakieś sugestie?

+0

Dlaczego szukasz rozwiązania 1-liniowego? – mgilson

+0

Kiedy używam 'gnuplot', zawsze nazywam to od wewnątrz' Perl'. Jeśli nie jest to opcja z jakiegokolwiek powodu, polecam wywołanie 'awk' z wnętrza skryptu' gnuplot'. Zobacz [tutaj] (http://stackoverflow.com/questions/12846717/using-awk-or-other-other-shell-command-inside-gnuplot-function) i [tutaj] (http: //security.riit.tsinghua. edu.cn/~bhyang/ref/gnuplot/datafile3-e.html), aby znaleźć sposób na osiągnięcie tego. – Steve

Odpowiedz

0
awk '/1/ {print "plot "$2"*x**2+"$3"*x+"$4}' | gnuplot -persist 

Czy wybrać linię i wykreślić to

1

pytanie (gnuplot store one number from data file into variable) miał jakieś wskazówki dla mnie w pierwszej odpowiedzi.

W moim przypadku mam plik, który zawiera parametry paraboli. Zapisałem parametry w zmiennych gnuplot. Następnie wykreślam funkcję zawierającą zmienne parametrów dla każdego taktu.

#!/usr/bin/gnuplot 

datafile = "parabola.txt" 

set terminal pngcairo size 1000,500 
set xrange [-100:100] 
set yrange [-100:100] 
titletext(timepar, apar, cpar) = sprintf("In timestep %d we have parameter a = %f, parameter c = %f", timepar, apar, cpar) 

do for [step=1:400] { 
    set output sprintf("parabola%04d.png", step) 

    # read parameters from file, where the first line is the header, thus the +1 
    a=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $1}' " . datafile) 
    c=system("awk '{ if (NR == " . step . "+1) printf \"%f\", $2}' " . datafile) 

    # convert parameters to numeric format 
    a=a+0. 
    c=c+0. 

    set title titletext(step, a, c) 

    plot c+a*x**2 
} 

Daje szereg png plików o nazwie parabola0001.png, parabola0002.png, parabola0003.png, ..., każdy przedstawiający parabolę z parametrów odczytanych z pliku o nazwie parabola.txt. Tytuł zawiera parametry danego kroku czasu.

dla zrozumienia funkcji gnuplot system() trzeba wiedzieć, że:

  • rzeczy wewnątrz cudzysłów nie jest analizowany przez gnuplot
  • kropka jest łączenie ciągów w gnuplot
  • podwójnych cudzysłowów dla Komenda awk printf musi zostać zmieniona, aby ukryć je przed parserem gnuplot

Aby przetestować ten skrypt gnuplot, zapisz go do pliku o dowolnej nazwie, np. parabolaplot.gplot i sprawiają, że jest on wykonywany (chmad a+x parabolaplot.gplot).Plik parabola.txt mogą być tworzone z

awk 'BEGIN {for (i=1; i<=1000; i++) printf "%f\t%f\n", i/200, i/100}' > parabola.txt

3

Innym possibilty mieć nieco rodzajowego wersję dla tego, można wykonać następujące czynności:

Załóżmy, parametry są zapisywane w pliku parameters.dat z pierwszą wiersz zawierający nazwy zmiennych i wszystkich innych zestawach parametrów, jak

location a b c 
1  1 3 4 

pliku skryptu wygląda następująco:

file = 'parameters.dat' 
par_names = system('head -1 '.file) 
par_cnt = words(par_names) 

# which parameter set to choose 
par_line_num = 2 
# select the respective string 
par_line = system(sprintf('head -%d ', par_line_num).file.' | tail -1') 
par_string = '' 
do for [i=1:par_cnt] { 
    eval(word(par_names, i).' = '.word(par_line, i)) 
} 
f(x) = a*x**2 + b*x + c 

plot f(x) title sprintf('location = %d', location)