2013-02-21 16 views
6

Gibt es eine Möglichkeit, eine Funktion basierend auf Werten aus einer Textdatei zu plotten?Plotten einer Funktion direkt aus einer Textdatei

Ich weiß, wie man eine Funktion in gnuplot definiert und dann plottet, aber das ist nicht was ich brauche. Ich habe eine Tabelle mit Konstanten für Funktionen, die regelmäßig aktualisiert werden. Wenn dieses Update passiert, möchte ich in der Lage sein, ein Skript auszuführen, das eine Figur mit dieser neuen Kurve zeichnet. Da es sehr wenige Figuren zu zeichnen gibt, möchte ich das Verfahren automatisieren. Hier

ist ein Beispiel-Tabelle mit Konstanten:

location a b c 
1  1 3 4 
2 

Es gibt zwei Möglichkeiten, wie ich sehe das Problem zu lösen, aber ich weiß nicht, ob und wie sie umgesetzt werden können.

  1. dann kann ich awk verwenden, um die Zeichenfolge zu erzeugen: f(x)=1(x)**2+3(x)+4, schreiben Sie es in eine Datei und irgendwie gnuplot lesen machen diese neue Datei und die Handlung auf einem bestimmten x Bereich.
  2. oder verwenden Sie awk in gnuplot so etwas wie f(x) = awk /1/ {print "f(x)="$2 usw., oder verwenden Sie awk direkt im Plot-Befehl.

Ich bin auf jeden Fall fest und habe keine Lösung für dieses Problem online gefunden, haben Sie irgendwelche Vorschläge?

+0

Warum suchen Sie eine 1-Linien-Lösung? – mgilson

+0

Wenn ich 'gnuplot' benutze, rufe ich es immer aus' Perl' heraus. Wenn dies aus irgendwelchen Gründen nicht möglich ist, würde ich empfehlen, 'awk' aus dem' gnuplot'-Skript heraus aufzurufen. Siehe [hier] (http://stackoverflow.com/questions/12846717/using-awk-or-other-shell-command-inside-gnuplot-function) und [hier] (http: //security.riit.tsinghua. edu.cn/~bhyang/ref/gnuplot/datafile3-e.html), um dies zu erreichen. – Steve

Antwort

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

Wird die Zeile auswählen und zeichnet es

1

Diese Frage (gnuplot store one number from data file into variable) für mich einige Hinweise hatte in der ersten Antwort.

In meinem Fall habe ich eine Datei, die Parameter für eine Parabel enthält. Ich habe die Parameter in gnuplot Variablen gespeichert. Dann zeichne ich die Funktion mit den Parametervariablen für jeden Zeitschritt auf.

#!/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 
} 

Daraus ergibt sich eine Reihe von PNG-Dateien genannt parabola0001.png, parabola0002.png, parabola0003.png, ..., die jeweils eine Parabel mit den Parametern lesen aus der Datei parabola.txt aufgerufen zeigt. Der Titel enthält die Parameter des angegebenen Zeitschritts.

Zum Verständnis der gnuplot system() Funktion, die Sie müssen wissen, dass:

  • Zeug in doppelten Anführungszeichen nicht durch gnuplot analysiert wird
  • der Punkt ist für Streicher in gnuplot
  • die doppelten Anführungszeichen für das verketten awk printf Befehl entkommen zu haben, sich zu verstecken sie von gnuplot Parser

dieses gnuplot Skript zu testen, speichern sie es in eine Datei mit einem beliebigen Namen, z. parabolaplot.gplot und machen es ausführbar (chmad a+x parabolaplot.gplot).Die parabola.txt Datei kann mit

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

3

Eine weitere Möglichkeit geschaffen werden, eine etwas generische Version für diese haben, können Sie wie folgt vorgehen:

Angenommen werden die Parameter in einer Datei gespeichert parameters.dat mit dem ersten Linie die Variablennamen und alle anderen die Parametersätze, wie

location a b c 
1  1 3 4 

Die Skriptdatei sieht wie folgt enthält:

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) 
Verwandte Themen