我想创建一个看起来像文件的散点图:
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个点。
我以前实际上搜索过这个问题,找到了解决方案并解决了。因此,我知道某个地方有答案。但是显然我丢失了代码。我已经搜索了一个小时的旧帖子,但是找不到。
有人可以在这里使用自定义标签吗?
答案 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
在随机生成的输入上,它给出以下输出:
答案 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
是无效值,因此将跳过所有其他值。