1

我想绘制一个已经创建的直方图数据,存储在 hist.dat 中:

#hist1
100
1
9
10
30
30
10
9
1

其中(第零行是注释),第一行包含直方图 y 值的总和,x 值为 1、2、...(行号)。所以没有规范,我可以使用

plot "hist.dat" every::1 using 0:1

我可以使用规范

plot "hist.dat" every::1 using 0:($1/100)

问题是如何引用总和值(100)?因为我不想仅仅为了创建正确的gnuplot代码而预读文件,所以我不想写下隐含的值。我已经试过了

plot "hist.dat" using 0:($1/(columnhead+0))

但是 columnhead 不能在 using 中调用(它是一个字符串,这就是我尝试添加 0 以使其成为 int 的原因)。

我不想修改文件或基于这个文件创建一个新文件,我只想使用适当的 gnuplot 命令。我想避免忽略总和值并使用 gnuplot 重新计算它。


解决方案:根据给出正确答案的andyras,稍微改进的方法是

first(x) = ($0 == 0) ? (first = column(x), 1/0) : first

plot "hist.dat" using 0:($1/first(1))

因此,如果您有多个列,就像 hist.dat 一样,您可以使用它来绘制直方图

#hist1  hist2
10000   8000
1000    50
9000    70
1000    1100
3000    4500
3000    1200
1000    700
9000    380
1000    
4

1 回答 1

2

如何参考总和值(100)?(无需预读文件)

是的,使用 gnuplot 函数:

first(x) = ($0 == 0) ? (first = $1, 1/0) : first

plot "hist.dat" using 0:($1/first($1))

如果它正在读取第一行,则该函数将该行中的值分配给变量first并返回 1/0(gnuplot 将其视为缺失数据并且不会扩展 x 范围以包含该点)。否则,函数返回 的值first

这样你甚至不必使用every ::1.

如果您不介意重新读取文件,您可以使用该stats命令找出文件中的最大值。

于 2012-12-25T22:30:51.433 回答