Für meine Auswertung habe ich gnuplot
verwendet, um Daten aus zwei separaten csv-Dateien (in diesem Link: https://drive.google.com/open?id=0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs) mit einer anderen Anzahl von Zeilen zu plotten, die das folgende Diagramm generiert.Python - Interpolation von Plots
Diese Daten scheinen keine gemeinsamen Zeitstempel (die erste Spalte) in beiden csv
Dateien zu haben und noch gnuplot
scheint das Plotten zu passen, wie oben gezeigt.
Hier ist das gnuplot
Skript, das ich verwende, um mein Grundstück zu generieren.
# ###### GNU Plot
set style data lines
set terminal postscript eps enhanced color "Times" 20
set output "output.eps"
set title "Actual vs. Estimated Comparison"
set style line 99 linetype 1 linecolor rgb "#999999" lw 2
#set border 1 back ls 11
set key right top
set key box linestyle 50
set key width -2
set xrange [0:10]
set key spacing 1.2
#set nokey
set grid xtics ytics mytics
#set size 2
#set size ratio 0.4
#show timestamp
set xlabel "Time [Seconds]"
set ylabel "Segments"
set style line 1 lc rgb "#ff0000" lt 1 pi 0 pt 4 lw 4 ps 0
plot "estimated.csv" using ($1):2 with lines title "Estimated", "actual.csv" using ($1):2 with lines title "Actual";
Ich wollte meine grüne Linie in das Netz, wo meine rosa Linie definiert ist, dann vergleichen, die beiden zu interpolieren. Hier ist mein erster Ansatz
#!/usr/bin/env python
import sys
import numpy as np
from shapely.geometry import LineString
#-------------------------------------------------------------------------------
def load_data(fname):
return LineString(np.genfromtxt(fname, delimiter = ','))
#-------------------------------------------------------------------------------
lines = list(map(load_data, sys.argv[1:]))
for g in lines[0].intersection(lines[1]):
if g.geom_type != 'Point':
continue
print('%f,%f' % (g.x, g.y))
Then in Gnuplot, one can invoke it directly:
set terminal pngcairo
set output 'fig.png'
set datafile separator comma
set yr [0:700]
set xr [0:10]
set xtics 0,2,10
set ytics 0,100,700
set grid
set xlabel "Time [seconds]"
set ylabel "Segments"
plot \
'estimated.csv' w l lc rgb 'dark-blue' t 'Estimated', \
'actual.csv' w l lc rgb 'green' t 'Actual', \
'<python filter.py estimated.csv actual.csv' w p lc rgb 'red' ps 0.5 pt 7 t ''
, die uns die folgende Handlung gibt
ich die gefilterten Punkte auf eine andere Datei (filtered_points.csv
in diesem Link: https://drive.google.com/open?id=0B2Iv8dfU4fTUSHVOMzYySjVzZWc) schrieb aus diesem Skript. Die gefilterten Punkte sind jedoch weniger als 10% des tatsächlichen Datensatzes (was die Grundwahrheit ist).
Gibt es eine Möglichkeit, wo wir die zwei Linien interpolieren können, indem Sie die pinkfarbenen hohen Spitzen über der grünen Kurve mit python
ignorieren? scheint nicht das beste Werkzeug dafür zu sein. Wenn die rosa Linie die grüne Linie nicht berührt (dh, wenn sie weit unter der grünen Linie liegt), möchte ich die Werte der nächsten grünen Linie nehmen, so dass es eine Eins-zu-Eins-Übereinstimmung ist (oder sehr nahe) mit dem eigentlichen Datensatz. Ich möchte die interpolierten Werte für die grüne Linie im rosa Linienraster zurückgeben, so dass wir beide Linien vergleichen können, da sie dieselbe Array-Größe haben.
Ich glaube, ich verstehe nicht, was du willst es wirklich tun. Was bedeutet "Ich wollte meine grüne Linie in das Gitter interpolieren, wo meine rosa Linie definiert ist, dann vergleiche die beiden." bedeuten? In meinem Verständnis magst du: 1. Passen Sie die grüne Kurve 2. Stellen Sie sicher, dass alle Ihre rosa Daten unter dem grünen 3. Vergleichen Sie die Daten und auf diese Weise suchen Sie nach Kreuzungen. 4. Geben Sie diese Schnittpunktdaten zurück Ist das richtig? Ist die grüne Kurve nicht schon voll, wonach Sie suchen? – Franz
Welche Art von Interpolation? Linear? Splines? Andere? – Goyo
@Franz, GENAU !!! Aber was ich schließlich wollte, ist eine Eins-zu-eins-Datengröße der grünen und rosa Linien. Wenn Sie die CSV-Dateien in diesem Link gesehen haben: https://drive.google.com/drive/folders/0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs - wir haben mehr Datenpunkte in der Datei "geschätzt.csv" als in der Datei "aktuell.csv" (Grundwahrheit) . In diesem Fall möchte ich glätten, damit es so zur Grundwahrheit passt. Wenn es eine Lücke gibt (wie Sie aus dem Diagramm sehen können, sind einige Punkte unterhalb der grünen Linie - in diesem Fall nehmen wir den aktuellen Wert (Datenpunkt) der grünen Linie). Hoffe das erklärt. –