Class: SPCore::Plotter

Inherits:
Object
  • Object
show all
Includes:
Hashmake::HashMakeable
Defined in:
lib/spcore/util/plotter.rb

Overview

Helps make plotting data even easier. Uses gnuplot.

Constant Summary collapse

ARG_SPECS =

Used to process hashed args passed to #initialize.

{
  :title => arg_spec(:type => String, :reqd => false, :default => ""),
  :xlabel => arg_spec(:type => String, :reqd => false, :default => "x"),
  :ylabel => arg_spec(:type => String, :reqd => false, :default => "y"),
  :linestyle => arg_spec(:type => String, :reqd => false, :default => "lines"),
  :linewidth => arg_spec(:type => Fixnum, :reqd => false, :default => 1, :validator => ->(a){ a >= 1 }),
  :logscale => arg_spec(:type => String, :reqd => false, :default => ""),
}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(hashed_args = {}) ⇒ Plotter

A new instance of Plotter.

Parameters:

  • hashed_args (Hash) (defaults to: {})

    A hash containing initialization parameters. All params are optional. See ARG_SPECS for parameter details.



23
24
25
# File 'lib/spcore/util/plotter.rb', line 23

def initialize hashed_args = {}
  hash_make hashed_args, Plotter::ARG_SPECS
end

Class Method Details

.plot_1d(titled_sequences) ⇒ Object

Plot a sequence of values.

Examples:

Plotter.plot_1d "somedata" => [0,2,3,6,3,-1]

Parameters:

  • titled_sequences (Hash)

    A hash that maps title strings to data sequences. The data itself is an array of values. In the plot, values will be mapped to their index in the sequence.



104
105
106
# File 'lib/spcore/util/plotter.rb', line 104

def self.plot_1d titled_sequences
  return Plotter.new.plot_1d titled_sequences
end

.plot_2d(titled_hashes) ⇒ Object

Plot XY datapoints.

Examples:

Plotter.plot_2d "somedata" => {0.0 => 4.0, 1.0 => 2.0}

Parameters:

  • titled_hashes (Hash)

    A hash that maps title strings to 2d datasets. The dataset itself is a hash also, that maps x values to y values.



62
63
64
# File 'lib/spcore/util/plotter.rb', line 62

def self.plot_2d titled_hashes
  return Plotter.new.plot_2d titled_hashes
end

.plot_datasets(datasets) ⇒ Object

Plot Gnuplot::DataSet objects.

Parameters:

  • datasets (Array)

    An array of Gnuplot::DataSet objects.



127
128
129
# File 'lib/spcore/util/plotter.rb', line 127

def self.plot_datasets datasets
  Plotter.new.plot_datasets datasets
end

.plot_signals(signals_hash) ⇒ Object

Plot data from Signal objects.

Parameters:

  • signals_hash (Hash)

    A hash that maps title strings Signal objects



143
144
145
# File 'lib/spcore/util/plotter.rb', line 143

def self.plot_signals signals_hash
  Plotter.new.plot_signals signals_hash
end

Instance Method Details

#plot_1d(titled_sequences) ⇒ Object

Plot a sequence of values.

Examples:

Plotter.new.plot_1d "somedata" => [0,2,3,6,3,-1]

Parameters:

  • titled_sequences (Hash)

    A hash that maps title strings to data sequences. The data itself is an array of values. In the plot, values will be mapped to their index in the sequence.



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/spcore/util/plotter.rb', line 74

def plot_1d titled_sequences
  datasets = []
  titled_sequences.each do |title, sequence|
    indices = Array.new(sequence.size)
    sequence.each_index do |i|
      indices[i] = i
      #if plot_against_fraction
      #  indices[i] /= sequence.size.to_f
      #end
    end
    
    dataset = Gnuplot::DataSet.new( [indices, sequence] ){ |ds|
      ds.with = @linestyle
      ds.title = title
      ds.linewidth = @linewidth
    }
    datasets << dataset
  end
  
  plot_datasets datasets
end

#plot_2d(titled_hashes) ⇒ Object

Plot XY datapoints.

Examples:

Plotter.new.plot_2d "somedata" => {0.0 => 4.0, 1.0 => 2.0}

Parameters:

  • titled_hashes (Hash)

    A hash that maps title strings to 2d datasets. The dataset itself is a hash also, that maps x values to y values.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/spcore/util/plotter.rb', line 34

def plot_2d titled_hashes
  datasets = []
  titled_hashes.each do |title, hash|
    # sort the data
    
    sorted = {}
    hash.keys.sort.each do |key|
      sorted[key] = hash[key]
    end
    
    dataset = Gnuplot::DataSet.new( [sorted.keys, sorted.values] ){ |ds|
      ds.with = @linestyle
      ds.title = title
      ds.linewidth = @linewidth
    }
    datasets << dataset
  end
  
  plot_datasets datasets
end

#plot_datasets(datasets) ⇒ Object

Plot Gnuplot::DataSet objects.

Parameters:

  • datasets (Array)

    An array of Gnuplot::DataSet objects.



110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/spcore/util/plotter.rb', line 110

def plot_datasets datasets
  Gnuplot.open do |gp|
    Gnuplot::Plot.new(gp) do |plot|
      plot.title  @title
      plot.xlabel @xlabel
      plot.ylabel @ylabel
      plot.data = datasets
      
      if @logscale_x
        plot.logscale "x"
      end
    end
  end
end

#plot_signals(signals_hash) ⇒ Object

Plot data from Signal objects.

Parameters:

  • signals_hash (Hash)

    A hash that maps title strings Signal objects



133
134
135
136
137
138
139
# File 'lib/spcore/util/plotter.rb', line 133

def plot_signals signals_hash
  data_hash = {}
  signals_hash.each do |name, signal|
    data_hash[name] = signal.data
  end
  plot_1d data_hash
end