Notebook on nbviewer (original) (raw)
Plot a vector field¶
First let's look at a simple vector field plot. It requires four parameters x
, y
, dx
and dy
, where dx
and dy
determine the endpoints of the arrows attached to the points with coordinates given in x
and y
.
In [1]:
require 'gnuplotrb' include GnuplotRB include Math
x = Array.new(10) { (0..9).to_a }.flatten y = (0..9).map { |i| Array.new(10) {i} }.flatten dx = x.zip(y).map { |p| cos(p[0].to_fPI/10.0) } dy = x.zip(y).map { |p| sin(p[1].to_fPI/10.0) }
Plot.new([[x,y,dx,dy], with: 'vectors'], key: false, title: 'Vector Field')
Out[1]:
Gnuplot Produced by GNUPLOT 5.0 patchlevel rc2 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 Vector Field $DATA1
Colored arrows¶
Now, color the arrows according to their slope.
In [2]:
#the slopes of the vectors on the logistic scale col = dx.zip(dy).map do |p| p[0]==0 ? 1.0 : 1.0 / (1.0 + Math::exp(-p[1].to_f / p[0].to_f)) end
Plot.new([[x,y,dx,dy,col], with: 'vectors', filled: true, lc: 'palette'], key: false, tics: false, title: 'Vector Field')
Out[2]:
Gnuplot Produced by GNUPLOT 5.0 patchlevel rc2 Vector Field $DATA1
3D vector field¶
Vector fields may be visualized in 3D as well.
In [3]:
xx = ([x] * 10).flatten yy = ([y] * 10).flatten zz = (0..9).map { |i| Array.new(100) {i} }.flatten dxx = xx.zip(yy, zz).map { |p| cos(p[0].to_fPI/10.0) } dyy = xx.zip(yy, zz).map { |p| sin(p[1].to_fPI/10.0) } dzz = xx.zip(yy, zz).map { |p| cos(p[2].to_f*PI/10.0) } color = dxx.zip(dyy, dzz).map do |p| p[0]==0 ? 1.0 : 1.0 / (1.0 + exp(-p[1].to_f / p[0].to_f)) end Splot.new( [[xx,yy,zz,dxx,dyy,dzz,color], with: 'vectors', filled: true, lc: 'palette'], key: false, tics: false, title: '3D Vector Field' )
Out[3]:
Gnuplot Produced by GNUPLOT 5.0 patchlevel rc2 3D Vector Field gnuplot_plot_1