如何使用 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
我有三个来自 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