require 'date'
class GraphController < ApplicationController
+
+ class GruffGraff
+
+ def initialize(options)
+ size = "700x400"
+ @graph = options[:graph_type].new(size)
+
+ @graph.theme = { :background_colors => ['#73BF26', '#ffffff'] }
+ @graph.font = File.expand_path('/usr/X11R6/lib/X11/fonts/TTF/Vera.ttf',
+ RAILS_ROOT)
+
+ # fill in the data with the optional data name
+ @graph.data( options.fetch(:data_name, nil), options[:data] )
+
+ # set the labels or create an empty hash
+ @graph.labels = options[:interval_labels] \
+ if options.has_key?(:labels) and options[:labels].class = Hash
+ @graph.x_axis_label = options[:x_axis_label] \
+ if options.has_key?(:x_axis_label)
+ @graph.y_axis_label = options[:y_axis_label] \
+ if options.has_key?(:y_axis_label)
+ @graph.title = options[:title] if options.has_key?(:title)
+
+ @graph.minimum_value = 0.0
+
+ end
+
+ def output
+ return([@graph.to_blob, {:disposition => 'inline', :type => 'image/png'}])
+ end
+
+ end
+
# produce a graph of votes per day during an election
def votes_per_day
@election = Election.find(params[:id])
data, labels = get_votes_per_day_data(@election)
- line = Gruff::Line.new("700x400")
- line.theme = { :background_colors => ['#73BF26', '#ffffff'] }
- line.title = "Voters Per Day"
- line.font = File.expand_path('/usr/X11R6/lib/X11/fonts/TTF/Vera.ttf',
- RAILS_ROOT)
-
- line.data( "#{@election.name}", data )
- line.labels = labels
-
- line.x_axis_label = "Date"
- line.y_axis_label = "Number of Votes"
- line.minimum_value = 0.0
-
- send_data(line.to_blob, :disposition => 'inline', :type => 'image/png')
+ graph = GruffGraff.new( :graph_type => Gruff::Line,
+ :data_name => @election.name,
+ :data => data,
+ :interval_labels => labels,
+ :title => "Voters Per Day",
+ :x_axis_label => "Data",
+ :y_axis_label =>"Number of Votes")
+ send_data(*graph.output)
end
#will place votes in a fixed number of intervals, and shows votes over time
@election = Election.find(params[:id])
data, labels, scale = get_votes_per_interval_data(@election)
- line = Gruff::Line.new("700x400")
- line.theme = { :background_colors => ['#73BF26', '#ffffff'] }
- line.title = "Voters Over Time"
- line.font = File.expand_path('/usr/X11R6/lib/X11/fonts/TTF/Vera.ttf',
- RAILS_ROOT)
-
- line.data("#{@election.name}", data )
- line.labels = labels
-
- line.x_axis_label = scale
- line.y_axis_label = "Number of Votes"
- line.minimum_value = 0.0
-
- send_data(line.to_blob, :disposition => 'inline', :type => 'image/png')
+ graph = GruffGraff.new( :graph_type => Gruff::Line,
+ :data_name => @election.name,
+ :data => data,
+ :interval_labels => labels,
+ :title => "Voters Over Time",
+ :x_axis_label => scale,
+ :y_axis_label => "Number of Votes")
+ send_data(*graph.output)
end
def quickvote_bar
@borda_result = BordaVote.new(pref_tally).result
data, labels = get_borda_points(@borda_result)
- bar = Gruff::Bar.new("700x400")
- bar.theme = { :background_colors => ['#73BF26', '#ffffff'] }
- bar.title = "Points Per Candidate"
- bar.font = File.expand_path('/usr/X11R6/lib/X11/fonts/TTF/Vera.ttf',
- RAILS_ROOT)
-
- bar.data("#{@election.name}", data)
- bar.labels = labels
-
- bar.y_axis_label = "Points"
- bar.x_axis_label = "Candidate"
- bar.minimum_value = 0.0
- send_data(bar.to_blob, :disposition => 'inline', :type => 'image/png')
+ graph = GruffGraff.new( :graph_type => Gruff::Bar,
+ :data_name => @election.name,
+ :data => data,
+ :interval_labels => labels,
+ :title => "Points Per Candidate",
+ :y_axis_label => "Points",
+ :x_axis_label => "Candidate")
+ send_data(*graph.output)
end
private