【问题标题】:gnuplot - intersection of two plotsgnuplot - 两个图的交集
【发布时间】:2017-05-30 14:19:17
【问题描述】:

我正在使用 gnuplot 绘制来自两个单独的 csv 文件(在此链接中找到:https://drive.google.com/open?id=0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs)的数据,这些文件具有不同的行数,从而生成以下图表。

这些数据在csv 文件中似乎没有共同的时间戳(第一列),但gnuplot 似乎符合如上所示的绘图。

这是我用来生成情节的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-join 查询,但由于我上面解释的相同原因,它似乎没有打印出任何内容。

PS:如果蓝线没有碰到绿线(即如果它低于绿线),我想取最近的绿线的值,这样它就会是一对一的与实际数据集对应(或非常接近)。

【问题讨论】:

  • 除非我大错特错,否则 Gnuplot 不适合这项工作。这是一个用于绘图的程序,而不是用于数据操作或处理的程序。你想要一种通用的编程语言。
  • 您能否详细说明“地块的交叉点”是什么意思?您想保持“紫色数据”不变,只裁剪“绿色数据”上方的内容吗?
  • 我的意思是粉线和绿线相同(或接近相同)的点,从上图中可以看出。
  • 请更新数据链接....

标签: linux csv gnuplot


【解决方案1】:

也许可以以某种方式强制 Gnuplot 在精细网格上重新插入两个数据集,保存这些辅助数据,然后逐行比较。但是,我认为将这项任务委托给外部工具确实更实用。

这当然不是最有效的方法,但是“惰性方法”可能是读取数据点,将每个数据集解释为 LineString(线段的集合,基本上相当于假设数据点之间的线性插值) 然后计算交点。在 Python 中,执行此操作的脚本可能如下所示:

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

然后在 Gnuplot 中,可以直接调用它:

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

给出:

【讨论】:

  • @DestaHaileselassieHagos 您可以直接使用脚本并将其输出重定向到文件,例如python filter.py estimated.csv actual.csv &gt; points.csv
  • 我做了,在这里可以找到带有数据点的新图:drive.google.com/open?id=0B2Iv8dfU4fTUZGV6X1Bvb3c4TWs。但是,过滤后的点不到实际数据集的 10%(这是基本事实)。如果蓝线没有碰到绿线,让我们取绿线的值,这样它将与实际数据集一一对应(或非常接近)。让我编辑我的问题,我会将您的答案标记为已接受。
  • 你看到我最后一个问题 ewcz 了吗?
猜你喜欢
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2023-03-31
  • 2011-04-15
相关资源
最近更新 更多