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_f*PI/10.0) }
dy = x.zip(y).map { |p| sin(p[1].to_f*PI/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_f*PI/10.0) }
dyy = xx.zip(yy, zz).map { |p| sin(p[1].to_f*PI/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