如何使用 gnuplot 从三个向量绘制一个框

how to plot a box from three vectors with gnuplot

我有三个来自 O(0, 0, 0) 的向量 X、Y、Z:

1.02  4.30  1.50 0 ! X
5.33  5.05  5.60 0 ! Y
3.40  6.00  8.05 0 ! Z

我想绘制 (1) 这些向量,(2) 从这三个向量创建的框,以及 (3) 框内的任意点,如下图所示。你能告诉我怎么做吗?

set terminal postscript eps enhanced
set mapping cartesian
set output 'box_with_point.eps'
splot vectors.txt using 1:2:3:4:5:6 with vectors filled head lw 3

您要做的很明显:除了 3 个向量之外,您还必须绘制 9 个额外的线条。 但是,如何 用 gnuplot 做到这一点并不是很明显。 检查以下示例:

代码:

### plot unit cell
reset session
set view equal xyz
set view 80,72, 1.5
set xyplane relative 0
set border 4095

$Data <<EOD
1.02  4.30  1.50 0 ! X
5.33  5.05  5.60 0 ! Y
3.40  6.00  8.05 0 ! Z
EOD

$myPoint <<EOD
5.0  7.5   8.0
EOD

array X[3]
array Y[3]
array Z[3]
getXYZ(r) = (X[r+1]=, Y[r+1]=, Z[r+1]=)
myX(n) = X[(int([=10=])+n)%3+1]
myY(n) = Y[(int([=10=])+n)%3+1]
myZ(n) = Z[(int([=10=])+n)%3+1]

set key noautotitle

 splot $Data u (getXYZ(int([=10=])),0):(0):(0):1:2:3:0 w vec lc var lw 2, \
      $myPoint u 1:2:3 w p pt 7 ps 2 lc "red", \
      for [i=1:2] $Data u 1:2:3:(myX(i)):(myY(i)):(myZ(i)) w vec lc "grey" lw 2 nohead, \
      $Data u (+myX(1)):(+myY(1)):(+myZ(1)):(myX(2)):(myY(2)):(myZ(2)) w vec lc "grey" lw 2 nohead
### end of code

结果:

加法:

这是另一种方法,它可能更容易遵循并且简化了实际的绘图命令。有必要将数据放在数据块中。

代码:(结果同上)

### plot unit cell
reset session
set view equal xyz
set view 80,72, 1.5
set xyplane relative 0
set border 4095

$Data <<EOD
1.02  4.30  1.50 0 ! X
5.33  5.05  5.60 0 ! Y
3.40  6.00  8.05 0 ! Z
EOD

$myPoint <<EOD
5.0  7.5   8.0
EOD

Value(row,col) = real(word($Data[row],col))
Xx = Value(1,1)
Xy = Value(1,2)
Xz = Value(1,3)
Yx = Value(2,1)
Yy = Value(2,2)
Yz = Value(2,3)
Zx = Value(3,1)
Zy = Value(3,2)
Zz = Value(3,3)

set print $UnitCell
    print sprintf("%g %g %g", 0    , 0    , 0)
    print sprintf("%g %g %g", Xx   , Xy   , Xz)
    print sprintf("%g %g %g", Xx+Yx, Xy+Yy, Xz+Yz)
    print sprintf("%g %g %g", Yx   , Yy   , Yz)
    print sprintf("%g %g %g", 0    , 0    , 0)
    print ""
    print sprintf("%g %g %g", Zx      , Zy      , Zz)
    print sprintf("%g %g %g", Xx+Zx   , Xy+Zy   , Xz+Zz)
    print sprintf("%g %g %g", Xx+Yx+Zx, Xy+Yy+Zy, Xz+Yz+Zz)
    print sprintf("%g %g %g", Yx+Zx   , Yy+Zy   , Yz+Zz)
    print sprintf("%g %g %g", Zx      , Zy      , Zz)
set print
 
set key noautotitle

splot $myPoint u 1:2:3 w p pt 7 ps 2 lc "red", \
      $UnitCell w l lc "grey" lw 2, \
      $Data u (0):(0):(0):1:2:3:0 w vec lc var lw 2
### end of code