2017-05-30 1 views
3

J'utilise gnuplot pour tracer des données provenant de deux fichiers csv distincts (trouvés dans ce lien: https://drive.google.com/open?id=0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs) avec un nombre différent de lignes qui génère le graphique suivant.gnuplot - intersection de deux parcelles

enter image description here

Ces données ne semblent avoir aucun horodatage commun (la première colonne) dans les deux csv fichiers et encore gnuplot semble correspondre au tracé comme indiqué ci-dessus.

Voici le script gnuplot que j'utilise pour générer mon intrigue.

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

Est-il possible où l'on peut imprimer (écrire dans un fichier), les valeurs de l'intersection de ces parcelles en ignorant les pics au-dessus de terrain vert? J'ai aussi essayé de faire une requête sql-join mais il ne semble pas imprimer quoi que ce soit pour la même raison que je l'ai expliqué plus haut. PS: Si la ligne bleue ne touche pas la ligne verte (c'est-à-dire si elle est bien en dessous de la ligne verte), je veux prendre les valeurs de la ligne verte la plus proche pour que ce soit un une correspondance (ou très proche) avec l'ensemble de données réel.

+2

À moins que je suis très bien trompé, Gnuplot est le mauvais outil pour ce travail. C'est un programme pour tracer non pour la manipulation ou le traitement des données. Vous voulez un langage de programmation généraliste. – Wrzlprmft

+0

pourriez-vous élaborer davantage ce que vous entendez par «intersection des parcelles»? vous voulez conserver les "données violettes" telles quelles, ne recadrer que ce qui est au-dessus des "données vertes"? – ewcz

+0

Je veux dire les points où la ligne rose et la ligne verte sont les mêmes (ou à peu près les mêmes) que vous pouvez voir à partir de la parcelle ci-dessus. –

Répondre

5

Peut-être que l'on pourrait en quelque sorte forcer Gnuplot à réinterpoler les deux ensembles de données sur une grille fine, enregistrer ces données auxiliaires et ensuite les comparer ligne par ligne. Cependant, je pense qu'il est en effet beaucoup plus pratique de déléguer cette tâche à un outil externe. Ce n'est certes pas la manière la plus efficace de le faire, mais une "approche paresseuse" pourrait être de lire les points de données, d'interpréter chaque ensemble de données comme un LineString (collection de segments de ligne, essentiellement équivalente à une interpolation linéaire entre les données points) puis calculez les points d'intersection. En Python, le script pour faire cela pourrait ressembler à ceci:

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

Puis, en Gnuplot, on peut invoquer directement:

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

qui donne: enter image description here

+1

@DestaHaileselassieHagos vous pouvez utiliser le script directement et rediriger sa sortie vers un fichier, par exemple, 'python filter.py estimated.csv actual.csv> points.csv' – ewcz

+0

Je l'ai fait et le nouveau tracé avec les points de données se trouve ici: https://drive.google.com/open?id=0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs. Cependant, les points filtrés sont inférieurs à 10% de l'ensemble de données réel (ce qui est la vérité au sol). Si la ligne bleue ne touche pas la ligne verte, prenons la valeur de la ligne verte pour qu'elle soit une correspondance biunivoque (ou très proche) avec l'ensemble de données réel. Laissez-moi éditer ma question et je marquerai votre réponse comme acceptée. –

+0

Avez-vous vu ma dernière question ewcz? –