The GSL library itself does not include any utilities to visualize computation results. Some examples found in the GSL manual use GNU graph to show the results: the data are stored in data files, and then displayed by using GNU graph. Ruby/GSL provides simple interfaces to GNU graph to plot vectors or histograms directly without storing them in data files. Although the methods described below do not cover all the functionalities of GNU graph, these are useful to check calculations and get some speculations on the data.
Vector.graph(y[, options])
Vector.graph(nil, y[, y2, y3, ..., options])
Vector.graph(x, y1, y2, ...., options)
Vector.graph([x1, y1], [x2, y2], ...., options)
GSL::graph(y[, options])
GSL::graph(nil, y[, y2, y3, ..., options])
GSL::graph(x, y1, y2, ...., options)
GSL::graph([x1, y1], [x2, y2], ...., options)
These methods use the GNU graph utility to plot vectors. The options options given by a String. If nil is given for ARGV[0], auto-generated abscissa are used.
Ex:
>> require("gsl") >> x = Vector.linspace(0, 2.0*M_PI, 20) >> c = Sf::cos(x) >> s = Sf::sin(x) >> Vector.graph(x, c, s, "-T X -C -L 'cos(x), sin(x)'")
This is equivalent to Vector.graph([x, c], [x, s], "-T X -C -L 'cos(x), sin(x)'").
To create a PNG file,
>> Vector.graph(x, c, s, "-T png -C -L 'cos(x), sin(x)' > fig.png")
GSL::Vector#graph(options)
GSL::Vector#graph(x[, options])
These methods plot the vector using the GNU graph command. The options for the graph command are given by a String.
Ex1:
>> x = Vector[1..5] [ 1.000e+00 2.000e+00 3.000e+00 4.000e+00 5.000e+00 ] >> x.graph("-m 2") # dotted line >> x.graph("-C -l x") # color, x log scale >> x.graph("-X \"X axis\"") # with an axis label
Ex2: x-y plot
>> require("gsl") >> x = Vector.linspace(0, 2.0*M_PI, 20) >> c = Sf::cos(x) >> c.graph(x, "-T X -C -g 3 -L 'cos(x)'")
GSL::Histogram#graph(options)
This method uses the GNU plotutils graph to draw a histogram.
GSL::Function#graph(x[, options])
This method uses GNU graph to plot the function self. The argument x is given by a GSL::Vector or an Array.
Ex: Plot sin(x)
f = Function.alloc { |x| Math::sin(x) } x = Vector.linspace(0, 2*M_PI, 50) f.graph(x, "-T X -g 3 -C -L 'sin(x)'")
The code below uses GNUPLOT directly to plot vectors.
#!/usr/bin/env ruby require("gsl") x = Vector.linspace(0, 2*M_PI, 50) y = Sf::sin(x) IO.popen("gnuplot -persist", "w") do |io| io.print("plot '-'\n") x.each_index do |i| io.printf("%e %e\n", x[i], y[i]) end io.print("e\n") io.flush end
It is also possible to use the Ruby Gnuplot library.
require("gnuplot") require("gsl") require("gsl/gnuplot"); Gnuplot.open do |gp| Gnuplot::Plot.new( gp ) do |plot| plot.xrange "[0:10]" plot.yrange "[-1.5:1.5]" plot.title "Sin Wave Example" plot.xlabel "x" plot.ylabel "sin(x)" plot.pointsize 3 plot.grid x = GSL::Vector[0..10] y = GSL::Sf::sin(x) plot.data = [ Gnuplot::DataSet.new( "sin(x)" ) { |ds| ds.with = "lines" ds.title = "String function" ds.linewidth = 4 }, Gnuplot::DataSet.new( [x, y] ) { |ds| ds.with = "linespoints" ds.title = "Array data" } ] end end
Generated with the Darkfish Rdoc Generator 2.