Notebook on nbviewer (original) (raw)

  1. gnuplotrb
  2. notebooks Notebook

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