gnuplot - 在 gnuplot 中将向量剪裁在圆圈上

标签 gnuplot

我尝试在圆形区域中绘制一些矢量场。考虑以下 MWE

unset grid
unset tics
unset colorbox
unset border

set size square

besselj(n, x) = n > 1 ? 2*(n-1)/x*besselj(n-1,x) - besselj(n-2,x) : (n == 1 ? besj1(x) : besj0(x))
dbesselj(n, x) = n/x*besselj(n,x) - besselj(n+1,x)

rho(x,y) = sqrt(x**2+y**2)
phi(x,y) = atan2(y,x)

d = 1.0
l = 1.0
z = l/2

q = 1

set xrange [-d/2*1.1:d/2*1.1]
set yrange [-d/2*1.1:d/2*1.1]

Erho(x,y,n,ynp) = (-1/rho(x,y)) * besselj(n, (ynp*2/d)*rho(x,y)) * (-n*sin(n*phi(x,y))) * sin(q*pi*z/l)
Ephi(x,y,n,ynp) = (ynp*2/d) * dbesselj(n, (ynp*2/d)*rho(x,y)) * (cos(n*phi(x,y))) * sin(q*pi*z/l)

Ex(x,y,n,ynp) = rho(x,y) > d/2 ? NaN : cos(phi(x,y))*Erho(x,y,n,ynp) - sin(phi(x,y))*Ephi(x,y,n,ynp)
Ey(x,y,n,ynp) = rho(x,y) > d/2 ? NaN : sin(phi(x,y))*Erho(x,y,n,ynp) + cos(phi(x,y))*Ephi(x,y,n,ynp)

mag(x,y,n,ynp) = sqrt(Ex(x,y,n,ynp)**2 + Ey(x,y,n,ynp)**2)

set object circle at 0,0 size 0.5 fc black lw 3 front

set multiplot layout 1,2

set title 'TE_{01}'
set table 'tmp.dat'
set samples 16
set isosamples 16
plot '++' u 1:2:(Ex($1,$2,0,3.832)/50):(Ey($1,$2,0,3.832)/50) w vectors
unset table
set samples 250
set isosamples 250
plot '++' u 1:2:(mag($1,$2,0,3.832)) w image notitle, \
     'tmp.dat' u 1:2:3:4 w vectors head filled lc black lw 1 notitle

set title 'TE_{11}'
set table 'tmp.dat'
set samples 16
set isosamples 16
plot '++' u 1:2:(Ex($1,$2,1,1.841)/20):(Ey($1,$2,1,1.841)/20) w vectors
unset table
set samples 250
set isosamples 250
plot '++' u 1:2:(mag($1,$2,1,1.841)) w image notitle, \
     'tmp.dat' u 1:2:3:4 w vectors head filled lc black lw 1 notitle

unset multiplot

绘制了直径为 d 的圆内的矢量场及其大小。结果是

output from the above code

对于左图(TE01)来说,这完全没问题,但是右图(TE11)看起来很丑,因为有一些向量画在圆之外。我真正想要的结果是这样的

desired result

黑色圆圈之外没有向量。我怎样才能做到这一点? 我知道 gnuplot 中有 clip 函数,但这不允许指定用于剪切的形状。

最佳答案

您可以尝试以下方法。定义您自己的剪辑功能,例如一个圆圈。 首先,您需要检查数据点是否在您的圈子之外。 如果在外部,Clip(x,y) 返回 NaN;如果在内部,则返回 0。 现在,当您绘图时,只需将剪辑函数的值添加到您的值中即可。您的数据将被裁剪在一个圆圈内,因为某些 +0 保持不变,而某些 +NaN 将是 NaN 并且不会被绘制。如果您仅对 x(向量开始)和 x + delta x(向量结束)执行此操作就足够了。

代码:

### clip function in circle form
reset session
set size square

# create some test data
set samples 25
Scaling = 0.5
set table $Data
plot [-5:5] '++' u 1:2:(Scaling*$1/sqrt($1**2+$2**2)): \
         (Scaling*$2/sqrt($1**2+$2**2)) : (sqrt($1**2+$2**2)) with table
unset table

set palette rgb 33,13,10
CenterX = 0
CenterY = 0
Radius = 3.5
Clip(x,y) = sqrt((x-CenterX)**2 + (y-CenterY)**2) > Radius ? NaN : 0

set xrange[-6:6]
set yrange[-6:6]

set multiplot layout 1,3

    plot $Data u 1:2:3:4:5 w vec lc pal not

    plot $Data u ($1+Clip($1,$2)):2:($3+Clip($1+$3,$2+$4)):4:5 w vec lc pal not

    CenterX = 1
    CenterY = 1
    plot $Data u ($1+Clip($1,$2)):2:($3+Clip($1+$3,$2+$4)):4:5 w vec lc pal not

unset multiplot
### end of code

结果: enter image description here

关于gnuplot - 在 gnuplot 中将向量剪裁在圆圈上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60112119/

相关文章:

epslatex 终端中的 Gnuplot 符号,里面有点

gnuplot - gnuplot:如何将数据文件的每一行绘制为Y和增量X

bash - 如何使 "-persist"对 GNUPLOT 唯一

plot - GNUplot 批量绘图生成空绘图文件

plot - 如何为每个x值创建一个箱形图?

gnuplot - 彩色刻度线

gnuplot - 线下方的阴影区域

3d - 如何正确使用 `dgrid3d` 中的 `gnuplot`?

gnuplot - 在 WXMaxima GUI 中绘制图形

gnuplot - 为什么 gnuplot 启动后终端大小未定义?