使用Gnuplot每n个元素打印一次自定义标签

时间:2018-11-29 16:11:01

标签: plot gnuplot

我想创建一个看起来像文件的散点图:

counter  N   x  y   
  1     200  50 50  
  2     200  46 46  
  3     200  56 56  
  4     200  36 36
  5     200  56 56

此文件中有240行。 N每30行增加200。 因此,当我绘制数字时,我想创建x,y值与计数器的散点图。这是我的代码:

plot "file" using 1:3 title "hb" with points pt 2 ps 1 lc rgb "red", \
     "file" using 1:4 title "ls" with points pt 3 ps 1 lc rgb "blue"

结果,我的x轴范围为[1,240]。

问题是我希望x轴的标签包含第二列中的值,并且希望每30点后打印一次。

因此,我希望将我的x轴标签自定义为:[200,400,600,800,1000,1200,1400,1600],它们之间各有30个点。

我以前实际上搜索过这个问题,找到了解决方案并解决了。因此,我知道某个地方有答案。但是显然我丢失了代码。我已经搜索了一个小时的旧帖子,但是找不到。

有人可以在这里使用自定义标签吗?

2 个答案:

答案 0 :(得分:2)

我不确定如何从gnuplot中的数据生成xtics,因此我将使用bash为我生成它们:

#! /bin/bash
xtics='('$(cut -d' ' -f1,2 file | sort -nuk2 | sed 's/\(.*\) \(.*\)/\2 \1/;s/^/"/;s/ /" /;s/$/,\\/')$'\n)'
gnuplot <<EOF
set term png
set output '1.png'
set xtics $xtics
plot "file" using 1:3 title "hb" with points pt 2 ps 1 lc rgb "red", \
         "" using 1:4 title "ls" with points pt 3 ps 1 lc rgb "blue"
EOF

在随机生成的输入上,它给出以下输出:

generated graph

答案 1 :(得分:1)

您可以对xticlabel中的任何表达式求值以给出字符串或无效值。为了仅在第1列的某些值处设置标签,可以使用

plot "file" using 1:3:xtic(int($1)%30 == 0 ? strcol(2) : 1/0) title "hb" pt 2 lc rgb "red", \
     "" using 1:4 title "ls" pt 3 lc rgb "blue"

如果第1列中的值是30的倍数,则表达式xtic(int($1)%30 == 0 ? strcol(2) : 1/0)将放置第2列的字符串值。由于1/0是无效值,因此将跳过所有其他值。