如何在Gnuplot中创建像箭头线一样的流线型?

时间:2015-10-20 15:29:13

标签: plot gnuplot

我想在Gnuplot中创建像箭头线一样的流线,我已经拥有了我需要的数据点,所以我认为我的问题与this post说的不同,与this post不同,因为我已经获得了stramlines所需的数据。

我所做的是这样的:

have done

因此,红线是矢量显示流场,绿线是流线,以引导读者的通量方向。所有大的蓝色箭头都是我在GNUPLOT中绘制的目标。我知道如何在this post显示的情况下绘制中间箭头,但如果我想沿着线绘制更多箭头,我需要做什么代码?

更详细一点,我怎么能这样画:

aim

我在这里提供我的数据文件:

velocity.txt用于矢量流场数据为“索引,X,Y,vx,vy,粒子数”

line.txt用于简化数据为“X,Y”

和我的gnu文件很糟糕:

set terminal postscript eps size 108,16 enhanced font "Arial-Bold,100"
set output 'vector.eps'

unset key
set tics
set colorbox
set border 0
set xtics 2
#set xlabel 'x'
#set ylabel 'y'


set xrange [0:108]
set yrange [0:16]
#set cbrange [0:40]

set nolabel
set style line 4 lt 2 lc rgb "green" lw 2

plot 'velcoity.txt' u 2:3:(250*$4):(250*$5) with vectors lc 1,'line.txt' u 1:2 ls 4

谢谢!

1 个答案:

答案 0 :(得分:4)

要沿着一条线绘制箭头,您可以再次使用vectors绘图样式,就像您对流场一样。

但要想得到合适的情节,你必须考虑以下几点:

  1. 通常gnuplot将箭头的大小限制为箭头长度的一小部分。因此,如果您想绘制带箭头的连续线,箭头本身的长度应该非常短。为避免缩小箭头,请使用size ... fixed选项,该选项仅在5.0版本之后可用

  2. 您只有该行的轨迹xy值。要提取箭头方向,最简单的方法是使用两个相邻点之间的差异(或两个或三个点的距离)。

  3. 您可以在using语句中提取这些差异。作为伪代码,可以执行以下操作:

    if rownumber modulo 10 == 0:
        save x and y values
    else if rownumber modulo 10 == 1:
        draw arrow from previous point to current point, only with a head
    else 
        ignore the point.
    

    将此伪代码放在using语句中会出现以下内容:

    ev = 10
    avg = 1
    sc = 0.1
    plot 'line.txt' u (prev_x = (int($0)%ev == 0 ? $1 : prev_x), prev_y = (int($0)%ev == 0 ? $2 : prev_y), int($0)%ev == avg ? $1 : 1/0):2:(sc*(prev_x-$1)):(sc*(prev_y-$2)) w vectors backhead size 2,20,90 fixed ls 4
    

    为了使事情更加灵活,我介绍了一些变量:ev告诉你两个箭头之间的差异计数,avg用于计算箭头方向的两点之间的距离,以及{{1箭杆的长度。

  4. 作为进一步改进,您可以使用流场箭头的长度为流场矢量着色。这给出了以下脚本

    sc

    结果(reset unset key set tics set colorbox set border 0 set xtics 2 set autoscale xfix set autoscale yfix set autoscale cbfix set style line 4 lt 2 lc rgb "green" lw 2 ev=30 avg=3 sc=0.1 field_scale=500 plot 'velcoity.txt' u 2:3:(field_scale*$4):(field_scale*$5):(sqrt($4**2+$5**2)) with vectors size 1,15,45 noborder lc palette,\ 'line.txt' u 1:2 ls 4 w l,\ '' u (prev_x = (int($0)%ev == 0 ? $1 : prev_x), prev_y = (int($0)%ev == 0 ? $2 : prev_y), int($0)%ev == avg ? $1 : 1/0):2:(sc*(prev_x-$1)):(sc*(prev_y-$2)) w vectors backhead size 2,20,90 fixed ls 4 终端):

    enter image description here