用gnuplot绘制箭头

时间:2011-01-27 10:45:21

标签: gnuplot

我在模拟中生成了数据。生成的数据文件如下所示:

1990/01/01 99
1990/01/02 92.7
1990/01/03 100.3
1990/01/04 44.2
1990/01/05 71.23
...
2100/01/01 98.25

我可以通过简单地发出(长版本)命令来创建一个图表(简单地):

plot "simulation.dat" using 1:2 with line

我想添加第三列,添加箭头信息。第三列的编码如下:

  • 0 =>没有为该x轴值绘制箭头
  • 1 =>要为x轴值绘制的向上箭头
  • 2 =>要为x轴值绘制的向下箭头

我刚开始学习gnuplot,并会很感激如何使用gnuplot在第一个图上创建箭头?

3 个答案:

答案 0 :(得分:3)

我不认为有一种自动方法可以根据第三列同时创建所有箭头。您必须为每个箭头执行以下操作:

set arrow xval1,yval1 to xval2,yval2

您也可以使用相对箭头

set arrow xval1,yval1 rto 1,0

这将从xval1,yval1到(xval1 + 1),yval1

绘制一个水平箭头

plenty of options associated with the set arrow command

答案 1 :(得分:3)

如果您不想要箭头,那么您可以尝试冲动风格(使用冲动而不是线条) (如果你仍然希望线条在顶部,那么你可以绘制两次)。

如果您真的想要箭头,那么以下内容可能有所帮助:它使用for循环(或排序)将垂直箭头添加到绘图中。

Gnuplot script, for loop within or adding to existing plot

具体来说:

创建一个simloop.gp文件,如下所示:

count  = count+1
#save the count to count.gp
system 'echo '.count.' > count.gp'
#load the simloop shell
system "./simloop.sh"

#draw the arrow
load 'draw_arrow.gp'

if(count<max) reread

然后创建一个看起来像这样的simloop.sh文件

#!/bin/bash

#read the count
count=$(awk -F, '{print $1}' count.gp)
#read the file
xcoord=$(awk -v count=$count -F, 'BEGIN{FS=" ";}{ if(NR==count) print $1}' simulation.dat)
ycoord=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $2}' simulation.dat)
dir=$(awk -v count=$count -F, 'BEGIN{FS=" "}{ if(NR==count) print $3}' simulation.dat)

#choose the direction of the arrow
if [ \"$dir\" == \"0\" ]; then
    echo '' > draw_arrow.gp
fi

if [ \"$dir\" == \"1\" ]; then
  echo 'set arrow from ' $xcoord' ,0 to '$xcoord','$ycoord' head' > draw_arrow.gp
fi

if [ \"$dir\" == \"2\" ]; then
 echo 'set arrow from '$xcoord',0 to '$xcoord','$ycoord' backhead' > draw_arrow.gp
fi

然后创建一个类似的simulation.gp文件:

count = 0;
max = 5;
load "simloop.gp"
set yrange[0:*]
plot "simulation.dat" u 1:2 w l

确保shell文件具有可执行权限(chmod + wrx simloop.sh),加载gnuplot并输入

load "./simulation.gp"

这对我有用的数据文件

1  99   0
2  92.7 1
3 100.3 2
4 44.2  0
5 71.23 1

(为了测试我摆脱了时间格式化你应该能够毫不费力地把它放回去。)

然后我得到了这张图:enter image description here

我认为或多或少是你想要的。

答案 2 :(得分:1)

虽然这个问题很老,但这是我的答案。

可以使用vectors绘图样式,它可以根据列的值使用变量箭头样式:

set style arrow 1 backhead
set style arrow 2 head
set yrange[0:*]
set xdata time
set timefmt "%Y/%m/%d"
plot "simulation.dat" using 1:2 with line,\
     "" using 1:2:(0):(-$2):($3 == 0 ? 1/0 : $3) with vectors arrowstyle variable

列的值为1/0,该点被视为未定义且被跳过。