, that will be on next commit. LAso modified several voting methods within RubyVote to have
more useful instance variables and accessors available in the results class. the quickvote
results view has been updated to include a partial for displaying a condorcet vote table, w
hich is strangely appearing below the footer on the results page, it seems to be displaying
the correct data however.
test.log
tmp
public/engine_files
test.log
tmp
public/engine_files
size = "700x400"
@graph = options[:graph_type].new(size)
size = "700x400"
@graph = options[:graph_type].new(size)
- @graph.theme = { :background_colors => ['#73BF26', '#ffffff'] }
+ @graph.theme = { :colors => ['#000000', '#00FFFF', '#FFCC00', '#990033'],
+ :background_colors => ['#74ce00', '#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.font = File.expand_path('/usr/X11R6/lib/X11/fonts/TTF/Vera.ttf',
RAILS_ROOT)
# fill in the data with the optional data name
- #Check to see if multiple datasets, if so, fill them all!
- if options[:data].size > 1 && options[:data].all? {|i| i.is_a?(Array)}
+ #Check to see if multiple datasets, if so, fill them all!
+ if options[:data].is_a?(Hash)
+ options[:data].each_pair do |name, array|
+ @graph.data( name, array)
+ end
+ #if each dataset nameless, will have only multiple arrays
+ elsif options[:data].size > 1 && options[:data].all? {|i| i.is_a?(Array)}
options[:data].each do |array|
@graph.data( options.fetch(:data_name, "Data"), array)
end
options[:data].each do |array|
@graph.data( options.fetch(:data_name, "Data"), array)
end
def borda_bar
@election = Election.find(params[:id])
def borda_bar
@election = Election.find(params[:id])
- pref_tally = make_preference_tally(@election)
+ #pref_tally = make_preference_tally(@election)
- @borda_result = BordaVote.new(pref_tally).result
- data, labels = get_borda_points(@borda_result)
+ #@borda_result = BordaVote.new(pref_tally).result
+ data, labels = get_borda_points(@election.borda_result)
graph = GruffGraff.new( :graph_type => Gruff::Bar,
:data_name => @election.name,
graph = GruffGraff.new( :graph_type => Gruff::Bar,
:data_name => @election.name,
:x_axis_label => "Candidate")
send_data(*graph.output)
end
:x_axis_label => "Candidate")
send_data(*graph.output)
end
-
- def choices_positions
+ #Acording to Tufte, small, concomparitive, highly labeled data sets usually
+ # belong in tables. The following is a bar graph...but would it be better
+ #as a table?
+ def choices_positions
@election = Election.find(params[:id])
pref_tally = make_preference_tally(@election)
fulldata, labels = get_positions_info(@election)
@election = Election.find(params[:id])
pref_tally = make_preference_tally(@election)
fulldata, labels = get_positions_info(@election)
+ legend = Hash.new
+
+ @election.candidates.each_with_index do |candidate, index|
+ legend[candidate.name] = fulldata[index]
+ end
+
graph = GruffGraff.new( :graph_type => Gruff::Bar,
graph = GruffGraff.new( :graph_type => Gruff::Bar,
- :data_name => @election.name,
- :data => fulldata,
:interval_labels => labels,
:title => "Times Voted in Each Position",
:y_axis_label => "Number of Times Ranked",
:interval_labels => labels,
:title => "Times Voted in Each Position",
:y_axis_label => "Number of Times Ranked",
rank_labels[i] = (i+1).to_s
end
end
rank_labels[i] = (i+1).to_s
end
end
return buckets2.values, rank_labels
end
return buckets2.values, rank_labels
end
end
def get_borda_points(result)
end
def get_borda_points(result)
- #points holds how mnay points each candidate has received in array form
- #becasue Gruff::Bar#data takes only an array
points = Array.new
labels = Hash.new
points = Array.new
labels = Hash.new
--- /dev/null
+<% candidates = @election.candidates.sort.collect {|candidate| candidate.id} -%>
+<table class="voterbox">
+ <tr>
+ <td> </td>
+ <% candidates.each do |candidate| -%>
+ <th><%= candidate -%></th>
+ <% end -%>
+<% candidates.each do |winner| -%>
+ <tr>
+ <th><%= winner %></th>
+ <% candidates.each do |loser| -%>
+ <% if winner == loser -%>
+ <td> -- </td>
+ <% else %>
+ <td><%= @election.condorcet_result.matrix[winner][loser] %></td>
+ <% end -%>
+ <% end -%>
+ </tr>
+<%end -%>
\ No newline at end of file
<div class="clearbox"></div>
<h2>Voters</h2>
<div class="clearbox"></div>
<h2>Voters</h2>
<table class="voterbox">
<tr>
<th>IP Address</th>
<table class="voterbox">
<tr>
<th>IP Address</th>
+<%= render :partial => 'pref_table' %>
+
<%= 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 ) ) %><br />
<%= image_tag( graph_url( :action => 'choices_positions', :id => @election ) ) %>
<%= 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 ) ) %><br />
<%= image_tag( graph_url( :action => 'choices_positions', :id => @election ) ) %>
## the CloneproofSSDVote classes but should not be used directly.
class CondorcetVote < ElectionVote
## the CloneproofSSDVote classes but should not be used directly.
class CondorcetVote < ElectionVote
attr_accessor :results
def initialize(votes=nil)
attr_accessor :results
def initialize(votes=nil)
## directly.
class CondorcetResult < ElectionResult
## directly.
class CondorcetResult < ElectionResult
def initialize(voteobj=nil)
unless voteobj and voteobj.kind_of?( CondorcetVote )
raise ArgumentError, "You must pass a CondorcetVote array.", caller
end
super(voteobj)
def initialize(voteobj=nil)
unless voteobj and voteobj.kind_of?( CondorcetVote )
raise ArgumentError, "You must pass a CondorcetVote array.", caller
end
super(voteobj)
+ @matrix = voteobj.votes
def defeats(candidates=nil, votes=nil)
candidates = @election.candidates unless candidates
votes = @election.votes unless votes
def defeats(candidates=nil, votes=nil)
candidates = @election.candidates unless candidates
votes = @election.votes unless votes
class PluralityResult < ElectionResult
attr_reader :ranked_candidates
class PluralityResult < ElectionResult
attr_reader :ranked_candidates
def initialize(voteobj=nil)
super(voteobj)
def initialize(voteobj=nil)
super(voteobj)
b[1] <=> a[1]
end.collect {|a| a[0]}
b[1] <=> a[1]
end.collect {|a| a[0]}
+ @points = self.election.votes
+
# winners are anyone who has the same number of votes as the
# first person
@winners = @ranked_candidates.find_all do |i|
# winners are anyone who has the same number of votes as the
# first person
@winners = @ranked_candidates.find_all do |i|
def tally_vote(vote)
points = candidates.length - 1
vote.each do |candidate|
def tally_vote(vote)
points = candidates.length - 1
vote.each do |candidate|
def verify_vote(vote=nil)
vote.instance_of?( Array ) and
vote == vote.uniq
def verify_vote(vote=nil)
vote.instance_of?( Array ) and
vote == vote.uniq
class BordaResult < ElectionResult
attr_reader :ranked_candidates
class BordaResult < ElectionResult
attr_reader :ranked_candidates
def initialize(voteobj=nil)
super(voteobj)
votes = @election.votes
def initialize(voteobj=nil)
super(voteobj)
votes = @election.votes
@ranked_candidates = votes.sort do |a, b|
b[1] <=> a[1]
end.collect {|i| i[0]}
@ranked_candidates = votes.sort do |a, b|
b[1] <=> a[1]
end.collect {|i| i[0]}
@winners = @ranked_candidates.find_all do |i|
votes[i] == votes[@ranked_candidates[0]]
end
@winners = @ranked_candidates.find_all do |i|
votes[i] == votes[@ranked_candidates[0]]
end
+
+ @points = self.election.votes