如何在 Gnuplot 中创建类似箭头线的流线?
How to create streamline like arrow lines in Gnuplot?
我想在Gnuplot中创建一个类似箭头线的流线,我已经有了我需要的数据点,所以我认为我的问题和this post says and different from this post不一样,因为我已经获得了需要的数据对于 stramlines。
我做的是这样的:
所以红线是矢量表示流场,绿线是流线,引导读者流向。所有大的蓝色箭头都是我要在 GNUPLOT 中绘制的目标。我知道如何绘制中间箭头,如 this post 所示,但如果我想沿线绘制更多箭头,我需要做什么代码?
更详细一点,我该如何绘制:
我在这里提供我的数据文件:
velocity.txt为矢量流场数据为"index,X,Y,vx,vy,particle-numbers"
line.txt 用于精简数据为 "X,Y"
我的 gnu 文件是 bleow:
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*):(250*) with vectors lc 1,'line.txt' u 1:2 ls 4
谢谢!
要沿着一条线绘制箭头,您可以再次使用 vectors
绘图样式,就像您已经对流场所做的那样。
但是要得到一个合适的情节,你必须考虑几个要点:
通常 gnuplot 将箭头的大小限制为箭头长度的一小部分。所以,如果你想用箭头绘制一条连续的线,箭头本身的长度应该很短。为避免箭头缩小,使用 size ... fixed
选项,该选项仅在 5.0
版本后可用
你只有直线的轨迹,x
和 y
值。要提取箭头方向,最简单的方法是使用两个相邻点之间的差异(或者相距两个或三个点)。
您可以在 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([=11=])%ev == 0 ? : prev_x), prev_y = (int([=11=])%ev == 0 ? : prev_y), int([=11=])%ev == avg ? : 1/0):2:(sc*(prev_x-)):(sc*(prev_y-)) w vectors backhead size 2,20,90 fixed ls 4
为了让事情更灵活,我引入了一些变量:ev
告诉你两个箭头头之间的差异计数,avg
用于计算箭头方向的两点之间的距离,以及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*):(field_scale*):(sqrt(**2+**2)) with vectors size 1,15,45 noborder lc palette,\
'line.txt' u 1:2 ls 4 w l,\
'' u (prev_x = (int([=12=])%ev == 0 ? : prev_x), prev_y = (int([=12=])%ev == 0 ? : prev_y), int([=12=])%ev == avg ? : 1/0):2:(sc*(prev_x-)):(sc*(prev_y-)) w vectors backhead size 2,20,90 fixed ls 4
结果(qt
终端):
我想在Gnuplot中创建一个类似箭头线的流线,我已经有了我需要的数据点,所以我认为我的问题和this post says and different from this post不一样,因为我已经获得了需要的数据对于 stramlines。
我做的是这样的:
所以红线是矢量表示流场,绿线是流线,引导读者流向。所有大的蓝色箭头都是我要在 GNUPLOT 中绘制的目标。我知道如何绘制中间箭头,如 this post 所示,但如果我想沿线绘制更多箭头,我需要做什么代码?
更详细一点,我该如何绘制:
我在这里提供我的数据文件:
velocity.txt为矢量流场数据为"index,X,Y,vx,vy,particle-numbers"
line.txt 用于精简数据为 "X,Y"
我的 gnu 文件是 bleow:
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*):(250*) with vectors lc 1,'line.txt' u 1:2 ls 4
谢谢!
要沿着一条线绘制箭头,您可以再次使用 vectors
绘图样式,就像您已经对流场所做的那样。
但是要得到一个合适的情节,你必须考虑几个要点:
通常 gnuplot 将箭头的大小限制为箭头长度的一小部分。所以,如果你想用箭头绘制一条连续的线,箭头本身的长度应该很短。为避免箭头缩小,使用
size ... fixed
选项,该选项仅在 5.0 版本后可用
你只有直线的轨迹,
x
和y
值。要提取箭头方向,最简单的方法是使用两个相邻点之间的差异(或者相距两个或三个点)。您可以在
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([=11=])%ev == 0 ? : prev_x), prev_y = (int([=11=])%ev == 0 ? : prev_y), int([=11=])%ev == avg ? : 1/0):2:(sc*(prev_x-)):(sc*(prev_y-)) w vectors backhead size 2,20,90 fixed ls 4
为了让事情更灵活,我引入了一些变量:
ev
告诉你两个箭头头之间的差异计数,avg
用于计算箭头方向的两点之间的距离,以及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*):(field_scale*):(sqrt(**2+**2)) with vectors size 1,15,45 noborder lc palette,\
'line.txt' u 1:2 ls 4 w l,\
'' u (prev_x = (int([=12=])%ev == 0 ? : prev_x), prev_y = (int([=12=])%ev == 0 ? : prev_y), int([=12=])%ev == avg ? : 1/0):2:(sc*(prev_x-)):(sc*(prev_y-)) w vectors backhead size 2,20,90 fixed ls 4
结果(qt
终端):