From 45d47676ca3cc1c19b457f83a9482ba8b906f829 Mon Sep 17 00:00:00 2001 From: Date: Tue, 14 Aug 2007 04:04:36 -0400 Subject: [PATCH] Added the choices position and get_posititons_info to graph controller. Right now, since the graph graphs a different set of data for each candidate, the data function has to be called multiple times and I'm not sure how to do it/if it's possible within the class definition. As such, I've defined everything within the choices_position method for now. I'll be trying to figure out the kinks next. Overall, the graph is very confusing and might not be very useful in the end, but the data it uses is. --- app/controllers/graph_controller.rb | 74 +++++++++++++++++++++++++---- app/views/quickvote/results.rhtml | 2 +- 2 files changed, 67 insertions(+), 9 deletions(-) diff --git a/app/controllers/graph_controller.rb b/app/controllers/graph_controller.rb index 38025ef..17e1578 100644 --- a/app/controllers/graph_controller.rb +++ b/app/controllers/graph_controller.rb @@ -1,6 +1,6 @@ require 'date' class GraphController < ApplicationController - + class GruffGraff def initialize(options) @@ -63,11 +63,7 @@ class GraphController < ApplicationController :y_axis_label => "Number of Votes") send_data(*graph.output) end - - def quickvote_bar - @election = Election.find(params[:id]) - end - + def borda_bar @election = Election.find(params[:id]) pref_tally = make_preference_tally(@election) @@ -85,7 +81,69 @@ class GraphController < ApplicationController send_data(*graph.output) end + def choices_positions + @election = Election.find(params[:id]) + pref_tally = make_preference_tally(@election) + + fulldata = get_positions_info(@election) + (0...@election.candidates.size).each do |i| + sbar.data("Candidate#{i+1}", fulldata[i]) + end + + sbar = Gruff::Bar.new + sbar.title = "Times Voted in Each Position" + #sbar.theme = { :background_colors => ['#73BF26', '#ffffff'] } + sbar.font = File.expand_path('/usr/X11R6/lib/X11/fonts/TTF/Vera.ttf', + RAILS_ROOT) + + graph = GruffGraff.new( :graph_type => Gruff::Bar, + :data_name => @election.name, + :data => data, + :interval_labels => labels, + :title => "Times Candidate Was Voted Each Position", + :x_axis_label => "Rank", + :y_axis_label => "Number of Times") + + + + + sbar.x_axis_label = "Rank" + sbar.y_axis_label = "Number of Times Ranked" + + sbar.minimum_value = 0.0 + send_data(sbar.to_blob, :disposition => 'inline', :type => 'image/png') + + + #data, labels = get_positions_info(@election) + + end private + + def get_positions_info(election) + buckets = Hash.new + buckets2= Hash.new + ranks = Hash.new + + election.candidates.each do |candidate| + buckets[candidate.id] = [] + buckets2[candidate.id] = [] + end + + election.votes.each do |vote| + vote.rankings.each do |ranking| + buckets[ranking.candidate_id] << ranking.rank + end + end + + buckets.each_pair do |id, array| + (1..election.candidates.size).each do |i| + buckets2[id] << (array.find_all {|rank| rank == i}).size + end + end + + return buckets2.values + + end # generate the data and labels for each graph def get_votes_per_day_data(election) @@ -149,7 +207,7 @@ class GraphController < ApplicationController # Put votes into bucket according to the time interval to which they belong, # referenced by their key - # Will build a graph over time, as each successive interval wil lhave more + # Will build a graph over time, as each successive interval will have more # vote objects election.votes.each do |vote| buckets.keys.sort.each do |inter| @@ -175,7 +233,7 @@ class GraphController < ApplicationController interval_type = "Hour of the Day on 24 hour scale" else #more than 2 days means use dates for labels labels_hash[0] = (Date.parse(starttime.to_s)).to_s - labels_hash[(numcols/2)-1] = (Date.parse(starttime + (timedelta/2))).to_s + labels_hash[(numcols/2)-1] = (Date.parse((starttime + (timedelta/2)).to_s)).to_s labels_hash[numcols-1] = (Date.today).to_s interval_type = "The Date" end diff --git a/app/views/quickvote/results.rhtml b/app/views/quickvote/results.rhtml index 5fdfc3c..33bb038 100644 --- a/app/views/quickvote/results.rhtml +++ b/app/views/quickvote/results.rhtml @@ -165,5 +165,5 @@ by several other names.

<%= image_tag( graph_url( :action => 'votes_per_day', :id => @election ) ) %>
<%= image_tag( graph_url( :action => 'votes_per_interval', :id => @election ))%>
<%= image_tag( graph_url( :action => 'borda_bar', :id => @election ) ) %> - +<%= image_tag( graph_url( :action => 'choices_positions', :id => @election ) ) %> -- 2.39.5