Added the choices position and get_posititons_info to graph controller. Right now...
author<jlsharps@mit.edu> <>
Tue, 14 Aug 2007 08:04:36 +0000 (04:04 -0400)
committer<jlsharps@mit.edu> <>
Tue, 14 Aug 2007 08:04:36 +0000 (04:04 -0400)
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
app/views/quickvote/results.rhtml

index 38025effe8ee15ef907353f244a93e08c62b6ccf..17e157809aab4fb5020a4c76ebdd6d850115ce8f 100644 (file)
@@ -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 wilhave 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
index 5fdfc3c49624aae03bebe9f91eeab9e09e6deed3..33bb0388ab1957f7cf84400d40be10615281c5fc 100644 (file)
@@ -165,5 +165,5 @@ by several other names.</p>
 <%= image_tag( graph_url( :action => 'votes_per_day', :id => @election ) ) %><br />
 <%= image_tag( graph_url( :action => 'votes_per_interval', :id => @election ))%><br />
 <%= image_tag( graph_url( :action => 'borda_bar', :id => @election ) ) %>
-
+<%= image_tag( graph_url( :action => 'choices_positions', :id => @election ) ) %>
 

Benjamin Mako Hill || Want to submit a patch?