diff --git a/lib/githubviz.rb b/lib/githubviz.rb index 04ef07e..44e2983 100644 --- a/lib/githubviz.rb +++ b/lib/githubviz.rb @@ -66,7 +66,7 @@ def process_data if @user - @api = GitHubV3API.new('') + @api = GitHubV3API.new('c1616feca6aa3e63655dd92766a475c2227ed6a0') @data[@user] = @api.get("/users/#{@user}") @data[@user]['level'] = 0 @@ -80,7 +80,7 @@ def process_data get '/repo_viz' do @user = params[:user] - @api = GitHubV3API.new('') + @api = GitHubV3API.new('c1616feca6aa3e63655dd92766a475c2227ed6a0') user_data = @api.users.get(@user) my_repos = @api.repos.list page = 1 @@ -175,7 +175,12 @@ def process_data end get '/circle_viz' do + @api = GitHubV3API.new('c1616feca6aa3e63655dd92766a475c2227ed6a0') @user = params[:user] + user_data = @api.users.get(@user) + #@data[@user] = @api.get("/users/#{@user}") + #@data[@user]['follower_count'] = @data[@user]['followers'] + #@data[@user]['followers'] = @api.get("/users/#{@user}/followers") erb :circle end diff --git a/lib/public/d3.layout.js b/lib/public/d3.layout.js index d93fbe5..37115f9 100644 --- a/lib/public/d3.layout.js +++ b/lib/public/d3.layout.js @@ -69,48 +69,44 @@ d3.layout.chord = function() { function relayout() { var subgroups = {}, - groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], + sum_cell = [], k, x, x0, i, j; - + a = 0; + b = 0; + c = 0; chords = []; groups = []; // Compute the sum. k = 0, i = -1; while (++i < n) { x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; + x += matrix[i][j];// Summe der Zellinhalte } - groupSums.push(x); subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); + sum_cell.push({index: i, value: x});//Zum Zählen der "Null-Nodes" + k += x; //Addition und Zuweisung der Summe ausgehender Verlinkungen } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); + + a = 0; while (++a < sum_cell.length){ + if (sum_cell[a].value == 0){ + b += 1; + }else{ + c += 1; + } } - + //k += b; + //alert("Länge: " + sum_cell.length + ", b:" + b + ", k: " + k); // Convert the sum to scaling factor for [0, 2pi]. // TODO Allow start and end angle to be specified. // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; + k = (2 * Math.PI - padding * n - 0.025 * b) / k; + // Compute the start and end angle for each group and subgroup. // Note: Opera has a bug reordering object literal properties! @@ -119,23 +115,32 @@ d3.layout.chord = function() { var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], - a0 = x, - a1 = x += v * k; + + a0 = x += (v * k)/3, + a1 = x += (v * k)/3;//Neuzuweisung x (Startposition) + //if (v==0){a0 = a1 = x += 0.025/2} subgroups[di + "-" + dj] = { - index: di, + index: di, //jeder Index 23Mal vorhanden --> min = 0, max = 22 subindex: dj, startAngle: a0, endAngle: a1, - value: v + value: v //binäre Werte für ausgehende Verbindungen aus der quadratischen Beziehungs-Matrix --> je Index 23 Werte --> gesamt 23² }; + x += (v * k)/3 //Padding für Graphen des Nodes + //alert("subgroups: " + subgroups[di + "-" + dj].index + ", start: " + subgroups[di + "-" + dj].startAngle + ", end: " + subgroups[di + "-" + dj].endAngle + ", value: " + subgroups[di + "-" + dj].value); + } + if (x0 == x){ + x += 0.025 //zeige auch die Nodes, die keine ausgehenden Verbindungen haben } - groups.push({ - index: di, + groups.push({ // Groups bildet RückgabeArray an View + index: di, //Node startAngle: x0, endAngle: x, - value: (x - x0) / k + value: (x - x0) / k //Anzahl ausgehender Verbindungen je Node }); x += padding; + //alert("groups: " + groups[di].index + ", value: " + groups[di].value + ", start: " + groups[di].startAngle + ", end: " + groups[di].endAngle); + } // Generate chords for each (non-empty) subgroup-subgroup link. @@ -143,24 +148,38 @@ d3.layout.chord = function() { j = i - 1; while (++j < n) { var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); + if (source.value || target.value){ + if (source.value < target.value) { + var group = groups[source.index]; + if (group.startAngle == source.startAngle){ + source.startAngle += (group.endAngle - group.startAngle)/2; + source.endAngle += (group.endAngle - group.startAngle)/2;} + else if (group.endAngle == source.endAngle){ + source.startAngle -= (group.endAngle - group.startAngle)/2; + source.endAngle -= (group.endAngle - group.startAngle)/2;} + chords.push({source: target, target: source});} + //groups.push({source: target, target: source});} + + else { + var group = groups[target.index]; + if (group.startAngle == target.startAngle){ + target.startAngle += (group.endAngle - group.startAngle)/2; + target.endAngle += (group.endAngle - group.startAngle)/2;} + else if (group.endAngle == target.endAngle){ + target.startAngle -= (group.endAngle - group.startAngle)/2; + target.endAngle -= (group.endAngle - group.startAngle)/2; + } + chords.push({source: source, target: target});} + //groups.push({source: target, target: source});} + + + //alert("Index: " + chords[i].target.index + "TargetSTART: " + chords[i].target.startAngle + "TargetEND: " + chords[i].target.endAngle + "Value: " + chords[i].target.value); + } } } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords( - (a.source.value + a.target.value) / 2, - (b.source.value + b.target.value) / 2); - }); } + chord.matrix = function(x) { if (!arguments.length) return matrix; @@ -176,26 +195,6 @@ d3.layout.chord = function() { return chord; }; - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; chord.chords = function() { if (!chords) relayout(); diff --git a/lib/public/flare-imports.json b/lib/public/flare-imports.json new file mode 100644 index 0000000..b43b7fc --- /dev/null +++ b/lib/public/flare-imports.json @@ -0,0 +1,29 @@ +[ +{"name":"flare.analytics.cluster","size":3938,"imports":["flare.animate"]}, +{"name":"flare.analytics.graph","size":3534,"imports":["flare.animate","flare.vis.data","flare.util","flare.vis.operator"]}, +{"name":"flare.animate","size":17010,"imports":[]}, +{"name":"flare.data.converters","size":721,"imports":[]}, +{"name":"flare.data.DataField","size":1759,"imports":["flare.data.DataUtil"]}, +{"name":"flare.data.DataSchema","size":2165,"imports":["flare.data.DataField","flare.util"]}, +{"name":"flare.data.DataSet","size":586,"imports":["flare.data.DataTable"]}, +{"name":"flare.data.DataSource","size":3331,"imports":["flare.data.converters","flare.data.DataSchema"]}, +{"name":"flare.data.DataTable","size":772,"imports":["flare.data.DataSchema"]}, +{"name":"flare.data.DataUtil","size":3322,"imports":["flare.data.DataField","flare.data.DataSchema"]}, +{"name":"flare.display","size":8833,"imports":[]}, +{"name":"flare.flex","size":4116,"imports":["flare.display","flare.data.DataSet"]}, +{"name":"flare.physics","size":1082,"imports":[]}, +{"name":"flare.query","size":1616,"imports":[]}, +{"name":"flare.scale","size":2105,"imports":[]}, +{"name":"flare.util","size":8258,"imports":[]}, +{"name":"flare.vis.axis","size":1302,"imports":["flare.animate","flare.vis.Visualization"]}, +{"name":"flare.vis.controls","size":2138,"imports":["flare.vis.Visualization","flare.vis.operator"]}, +{"name":"flare.vis.data","size":20544,"imports":["flare.util","flare.vis.events","flare.data.DataSet","flare.data.DataSchema","flare.data.DataField"]}, +{"name":"flare.vis.events","size":2313,"imports":["flare.vis.data"]}, +{"name":"flare.vis.legend","size":4614,"imports":["flare.util","flare.display"]}, +{"name":"flare.vis.operator","size":4461,"imports":[]}, +{"name":"flare.vis.pix","size":4461,"imports":[]}, +{"name":"flare.vis.pic","size":4461,"imports":[]}, +{"name":"flare.vis.piz","size":4461,"imports":[]}, +{"name":"flare.vis.pit","size":4461,"imports":[]}, +{"name":"flare.vis.Visualization","size":16540,"imports":["flare.animate","flare.vis.operator","flare.vis.events","flare.vis.data","flare.vis.axis","flare.util","flare.vis.controls"]} +] diff --git a/lib/views/circle.erb b/lib/views/circle.erb index dad1c85..a753e61 100644 --- a/lib/views/circle.erb +++ b/lib/views/circle.erb @@ -1,5 +1,245 @@ -

Circle Mode

- +

<%= @user %>'s CIRCLE Mode

+ + + + + + + diff --git a/lib/views/follower.erb b/lib/views/follower.erb index 8710edf..5b2f78c 100644 --- a/lib/views/follower.erb +++ b/lib/views/follower.erb @@ -23,6 +23,9 @@ $('#chart').html(data); } }); + $('#desc_text').empty(); + $('#desc_text').append($("

network of followers

")); + $('#description').show(); }); $('#network_mode').click(function(ev){ ev.preventDefault(); @@ -40,6 +43,7 @@ });
+
@@ -57,7 +61,7 @@ Network Mode
-
+

<%= @user%>'s network of followers

This visualization shows the user's network of followers in 1 level or 2 levels.
In the 1st level all gitusers which are directly following <%=@user%> are displayed.
@@ -75,7 +79,7 @@ $(function (){ var w = $(window).width(), - h = $(window).height() - $("#header").height() -20, + h = $(window).height() - $("#header").height() -80, fill = d3.scale.category20(); var vis = d3.select("#chart").append("svg") diff --git a/lib/views/index.erb b/lib/views/index.erb index f1e99ab..2db66cc 100644 --- a/lib/views/index.erb +++ b/lib/views/index.erb @@ -112,6 +112,14 @@ font-size: 10pt; } + .gallery{ + text-align: center; + } + + #desc_text{ + width:450px; + } + #header{ padding:10px; } @@ -119,6 +127,7 @@ .description { text-align:center; clear:both; + height: 85px; } .formlabel { @@ -152,6 +161,39 @@ font-size: 10pt; padding: 5px 5px 0 0; } + + #chord { + font-size: 8pt; + font-family: sans-serif; + height: 700px; + width: 700px; + padding-left: 0px; + } + + path.chord { + fill-opacity: .85; + stroke-opacity: 1.0; + } + + path{ + fill-opacity: 1.0; + stroke-opacity: 1.0; + } + + .clickarea{ + width: 280px; + height: 280px; + margin: 210px 0 0 16%; + z-index: 1; + position: absolute; + cursor: pointer; + } + + svg { + clear: both; + position: absolute; + z-index: 0; + }