使用 gnuplot 绘制带有缩写值的数据文件

Plotting datafile with abbreviated values with gnuplot

我有一个如下所示的 gnuplot 数据文件:

 1  4810   582   573   587 
 2    99k   67k   56k   40k
 3   119k   82k   68k   49k
 4   119k   81k   68k   49k
 5   120k   81k   65k   45k
 6   121k   82k   65k   44k
 7   124k  106k   97k   86k
 8   128k  134k  131k  131k
 9   128k  130k  131k  135k
10   129k  133k  130k  132k

第一列将在 X 轴上标记为 "Time",其余是与时间相关的不同中断值(即 IRQ1、IRQ2、IRQ3、IRQ4)

用这个生成图时的问题是 gnuplot 似乎没有将带有 K 后缀的缩写值解释为以千为单位的数字,而是解释为原始值,例如 99、67、119 等。因此这些线将从时间 1 的 5000 左右跳到图中的 100 左右。

是否有任何选项可以告诉 gnuplot 自动解释缩写值并相应地绘制它们?

我认为没有直接的方式告诉 gnuplot 在这种情况下如何解释输入。

但是,您可以编写自己的函数将字符串输入转换为数字

check(x)=(pos=strstrt(x,"k"),\
    pos > 0 ? real(substr(x,1,pos-1))*1000  : real(x))

函数check首先判断字母'k'在输入中的位置。 (如果输入 x 不包含字母 'k',函数 strstrt returns '0'。)
如果输入中包含字母'k',则取输入,舍弃最后一个字母,将剩余部分转为数字乘以1000。 如果输入不包含'k'、return则输入

现在你可以绘制数据文件了(假设它的名字是test):

plot 'test' u 1:(check(stringcolumn(2))) w l

这应该可以完成工作!

一个非纯粹的 gnuplot,unix 解决方案将使用 process substitution:

plot "<(sed 's/k/000/g' datafile.dat)" u 1:2 w lp

sed 's/k/000/g' 命令将 datafile.dat 中所有出现的字符 k 替换为 000:例如96k 将替换为 96000.

输出类似于@Knorr

发布的情节