2017-05-30 12 views
3

私は、gnuplotを使用して、2つの別々のcsvファイル(このリンクにあるhttps://drive.google.com/open?id=0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs)のデータを、次のグラフを生成する異なる行数でプロットします。gnuplot - 2つのプロットの交差点

enter image description here

これらのデータは、両方のcsvファイルには、共通のタイムスタンプ(最初の列)を持っていないように見える、まだgnuplotは、上記のようにプロットを合わせているようです。

ここに私のプロットを生成するために使用するスクリプトがあります。

# ###### 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"; 

私たちは緑のプロット上のピークを無視して(ファイルに書き込む)これらのプロットの交点の値をプリントアウトすることができます方法はありますか?私もSQL結合クエリを実行しようとしましたが、上記の理由と同じ理由で何も印刷していないようです。

PS:青色の線が緑色の線に触れていない場合(つまり、緑色の線より下にある場合)、最も近い緑色の線の値を取得して、実際のデータセットと1つの対応(または非常に近い)。

+2

私は非常に多くの午前ない限りGnuplotはこの仕事の間違ったツールです。これは、データの操作や処理をプロットしないプログラムです。汎用プログラミング言語が必要です。 – Wrzlprmft

+0

"プロットの交差点"が意味することをもっと詳しく説明できますか?あなたは "バイオレットデータ"をそのまま保ちたいだけで、 "グリーンデータ"の上にあるものをトリミングするだけですか? – ewcz

+0

ピンク色の線と緑色の線が上のプロットから分かるように、同じ点(まったく同じ点)を指しています。 –

答えて

5

おそらく、Gnuplotに両方のデータセットを細かいグリッドに再挿入させ、この補助データを保存して、それを行ごとに比較することができます。しかし、私は、この作業を外部のツールに委譲することが本当にはるかに現実的だと考えています。

これは確かに効率的な方法ではありませんが、データポイントを読み込み、各データセットをLineString(線分の集合、データ間の直線補間ポイント)を計算し、交点を計算します。 Pythonでは、これを行うためのスクリプトは次のようになります。gnuplotの中に続いて

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

を、人はそれを直接呼び出すことができます。

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 '' 

与える: enter image description here

+1

@DestaHaileselassieあなたはスクリプトを直接使用して、その出力をファイルにリダイレクトすることができます。例えば、 'python filter.py estimated.csv actual.csv> points.csv' – ewcz

+0

データポイントを持つ新しいプロットはここにあります: https://drive.google.com/open?id=0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs。ただし、フィルタリングされたポイントは、実際のデータセットの10%未満です(グラウンドトゥルース)。青い線が緑色の線に触れない場合は、緑色の線の値を取って、実際のデータセットと1対1の(または非常に近い)値にします。私の質問を編集させて、私はあなたの答えを受け入れたものとしてマークします。 –

+0

あなたは私の最後の質問ewczを見たことがありますか? –