Gnuplot,沿x轴归一化

4

我有两个数据集,它们都涉及同一个过程以两种不同的方式执行。相对于实际时间,执行A比执行B要慢,但是这两个图表代表着同样的现象。

可以将它们绘制在一起,如下所示:

plot 'A' using 1:2, 'B' using 1:2

但是我得到了两个具有不同X轴刻度的图表:A速度较慢,所以图表更大。
我可以通过以下方式对图表进行归一化处理:
plot 'A' using ($1 / maxA):2, 'B' using ($1 / maxB):2

这对我来说完美地解决了问题。唯一的问题是maxAmaxB变量。它们很容易确定(分别为tail -n1 A | cut -f1tail -n1 B | cut -f1),但我想知道是否有自动化的方法。

非常感谢您的任何帮助。

更新

在应用了Wrzlprmft的优秀答案后,我最终得到了以下方案,非常方便:

max(Source) = system('tail -n ' . Source . '| cut -f1')

A = 'path/to/A'
maxA = max(A)
plot A using ($1 / maxA):2

另一个可能的改进是在max函数中包含一个Column参数,这样我们也可以调整cut命令中-f标志的参数。

更新

我改变了接受方案的想法,因为stats命令似乎更适合此目的。

谢谢大家。

2个回答

10

另一种方法是在gnuplot中使用stats命令,无需任何外部程序:

stats datafA using 1:2 name "A"
stats datafB using 1:2 name "B"

plot datafA using 1:2, datafB using ($1/B_max_x*A_max_x)

同时,它还能生成更多有用的数据统计信息,检查用 show var A(或者 BSTATS 如果你没有提供名称)来生成的变量。

或者(另一种解决方案),您可以在 x2y1 坐标系上绘制 B,其中 x2 轴会独立进行自动缩放。

set xtics nomirr
set x2tics 
set xrange [*:*] noextend # make sure the scaling is coherent
set x2range [*:*] noextend # by switching off extension
set link x2 via x*factor inverse x/factor # alternative, for gp>=v5.2
plot datafA us 1:2, datafB us 1:2 axes x2y1

自从gp 5.2版本以来,如果您知道您的横坐标值之间的关系,就可以直接连接两个轴。


2
system命令允许您执行程序并获取它们的输出。例如,在plot命令之前,您可以使用以下命令:
maxA = system("tail -n1 A | cut -f1")
maxB = system("tail -n1 B | cut -f1")

对不起,我必须切换接受方式,因为“stats”方法更适用于 Gnuplot。但是非常感谢,您的方式也很好。 - Dacav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接