2017-12-11 4 views
0

Ich habe ein Problem mit gnuplot. Ich muss zwei Datendateien anpassen (sagen wir Datei1 und Datei2), die 51 Spalten haben. Ich mache es in einer Schleife wie folgtgnuplot passen und neu schreiben Plot innerhalb Schleife

do for [j=2:51] { 
       fxj(x) = Dxj*x+ qxj 
       fit [xmin:xmax] fxj(x) '< paste file1 file2' u 1:(((column(j))+(column(j+51)))/2) via Dxj, qxj 
       print j, ' ', Dxj/2 
       } 

Alles wunderbar. Was ich jetzt tun muss, ist jede in der Schleife definierte fxj über die Daten zu plotten, damit sich die Rohdaten und die Anpassung überlappen. Ich habe versucht, es wie dieses

do for [j=2:51] { 
       fxj(x) = Dxj*x+ qxj 
       fit [xmin:xmax] fxj(x) '< paste file1 file2' u 1:(((column(j))+(column(j+51)))/2) via Dxj, qxj 
       print j, ' ', Dxj/2 
       plot '< paste file1 file2' u 1:(((column(j))+(column(j+51)))/2) t'', fxj(x) t'' 
       } 

, aber es funktioniert nicht. Haben Sie Vorschläge, damit es funktioniert?

+0

Willkommen bei SO. Können Sie der Frage hinzufügen, was genau mit Ihrem Code nicht funktioniert? Das macht es viel einfacher, sowohl Ihre Frage zu finden als auch zu beantworten. – m00am

+0

https://Stackoverflow.com/a/46959036/2604213 – Christoph

Antwort

1

Ein Ansatz könnte in Bezug auf multiplot wie in dem vereinfachten Beispiel unten sein. Die Idee besteht darin, die Plot-Ränder so zu fixieren, dass jedes nachfolgende Plot innerhalb der Multiplot-Umgebung über dieselbe "Fläche" plottet. Auch innerhalb der Schleife, macht das Skript sicher, dass für alle Grundstücke, aber die erste es die Tics usw. führt zum Löschen, so dass sie nicht mehrmals gezogen werden ...

set multiplot 

set lmargin at screen 0.1 
set rmargin at screen 0.9 
set bmargin at screen 0.1 
set tmargin at screen 0.9 

set xr [-2:2] 
set yr [-4:4] 

do for [j=1:3]{ 

    if(j>1){ 
     unset xtics; 
     unset ytics; 
     unset border; 
     unset xlabel; 
     unset ylabel; 
    } 

    set key at screen 0.3,0.9 - j*0.05 reverse 
    plot j*x w l t sprintf('plot %d', j); 
} 

Dies würde produzieren: enter image description here

Alternativ können Sie zuerst die do Schleife laufen, um die Koeffizienten innerhalb eines Arrays zusammenstellen und dann alles auf einmal Grundstück:

set xr [-2:2] 
set yr [-4:4] 

array coeffs_a[3] 
array coeffs_b[3] 

do for [j=1:3]{ 

    #save the fitted coefficients 
    coeffs_a[j] = j 
    coeffs_b[j] = j 

} 

plot for [j=1:3] coeffs_a[j]*x + coeffs_b[j] w l t sprintf('plot %d', j) 
+0

mein Favorit: die Legende für drei identische lila Linien. – mikuszefski

+0

@mikuszefski ah, in der Tat, was für eine Schande! :) Nun, ich wollte nur zeigen, wie man die Legende im überlappenden Plot-Szenario positioniert ... – ewcz