使用Gnuplot从文件中绘制多组信息

时间:2016-02-28 23:46:17

标签: plot charts gnuplot

我有一个看起来像这样的文件:

0 0.000000
1 0.357625
2 0.424783
3 0.413295
4 0.417723
5 0.343336
6 0.354370
7 0.349152
8 0.619159
9 0.871003
0.415044

最后一行是它上面列出的N个条目的平均值。我想要做的是绘制一个列出每个点的图表和一个平均值的行。我知道它涉及以某种方式重新绘制,但我无法单独读取最后一个值。

2 个答案:

答案 0 :(得分:1)

您可以使用stats命令进行两次传递以获取必要的数据

stats datafile u 1 nooutput
stats datafile u ($0==(STATS_records-1)?$1:1/0) nooutput

统计信息的第一次传递将汇总数据文件。我们真正感兴趣的是文件中的记录数,它将保存在变量 STATS_records 中。

第二遍将计算要分析的列。如果行号( $ 0 的值)等于一个小于记录数(行从0开始编号,所以这是最后一行),那么我们得到这个值,否则我们得到一个无效的值。这会导致stats命令仅查看最后一行。现在,最后一行的值存储在 STATS_max (或 STATS_min 和其他几个变量)中。

现在我们可以使用

创建绘图
plot datafile u 1:2, STATS_max

我们明确说明第1列和第2列,使第一个绘图规范忽略最后一行(实际上,如果我们只做plot datafile它应默认为此列选择并自动忽略最后一行,但这使得某些)。这会产生

enter image description here

另一种方法是使用外部程序过滤数据。例如,如果我们有linux命令 tail ,我们可以做 1

ave = system("tail -1 datafile")
plot datafile u 1:2, ave+0

此处, ave 将包含文件的最后一行作为字符串。在plot命令中,我们向它添加0以强制它更改为数字(否则gnuplot会认为它是文件名)。

其他外部程序也可用于读取最后一行。例如,以下对python3的调用(使用Windows样式shell引号)也是如此:

ave = system('python -c "print(open(datafile,\"r\").readlines()[-1])"')

或以下使用AWK(再次使用Windows样式的shell引号)具有相同的结果:

ave = system('awk "END{print}"')

甚至使用Perl(再次使用Windows shell引号):

ave = system('perl -lne "END{print $last} $last=$_" datafile')

<小时/> 1 tail 的使用现在已过时(根据GNU手册)命令行选项。建议使用tail -n 1 datafile。但是,这种缩短方式的类型较少,如果不需要向前兼容性(即您使用此脚本一次),则没有理由不使用它。

答案 1 :(得分:0)

Gnuplot忽略那些缺少数据的行(例如,数据文件的最后一行没有第2列)。然后,您可以简单地执行以下操作:

stats datafile using 2 nooutput
plot datafile using 1:2, STATS_mean

结果: stats_mean