Skip to content

Instantly share code, notes, and snippets.

@cemsbr
Last active November 14, 2016 22:54
Show Gist options
  • Save cemsbr/08d1cbf952d46c74346780e132967768 to your computer and use it in GitHub Desktop.
Save cemsbr/08d1cbf952d46c74346780e132967768 to your computer and use it in GitHub Desktop.
Flow chord
<!DOCTYPE html>
<script>//<![CDATA[
document.write('<script src="//' + (location.hostname || 'localhost') + ':35729/livereload.js?snipver=1"><\/script>')
//]]></script>
<meta charset="utf-8">
<style>
body {
font: 10px sans-serif;
}
.group-tick line {
stroke: #000;
}
.ribbons {
fill-opacity: 0.67;
}
</style>
<svg width="700" height="700"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
// From http://mkweb.bcgsc.ca/circos/guide/tables/
// var matrix = [
// [11975, 5871, 8916, 2868],
// [ 1951, 10048, 2060, 6171],
// [ 8010, 16145, 8090, 8045],
// [ 1013, 990, 940, 6907]
// ];
var Mbps = Math.pow(10, 6);
var matrix = [
[0, 1000, 3000, 0],
[0, 0, 0, 0],
[2000, 0, 0, 4000],
[0, 0, 3000, 0]
];
var svg = d3.select("svg"),
width = +svg.attr("width"),
height = +svg.attr("height"),
outerRadius = Math.min(width, height) * 0.5 - 40,
innerRadius = outerRadius - 30;
var formatValue = d3.formatPrefix(",.0", 1e3);
var chord = d3.chord()
.padAngle(0.05)
.sortSubgroups(d3.descending);
var arc = d3.arc()
.innerRadius(innerRadius)
.outerRadius(outerRadius);
var ribbon = d3.ribbon()
.radius(innerRadius);
var color = d3.scaleOrdinal()
.domain(d3.range(4))
.range(["#000000", "#FFDD89", "#957244", "#F26223"]);
var g = svg.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
.datum(chord(matrix));
var group = g.append("g")
.attr("class", "groups")
.selectAll("g")
.data(function(chords) { return chords.groups; })
.enter().append("g");
group.append("path")
.style("fill", function(d) { return color(d.index); })
.style("stroke", function(d) { return d3.rgb(color(d.index)).darker(); })
.attr("d", arc);
var groupTick = group.selectAll(".group-tick")
.data(function(d) { return groupTicks(d, 1e3); })
.enter().append("g")
.attr("class", "group-tick")
.attr("transform", function(d) { return "rotate(" + (d.angle * 180 / Math.PI - 90) + ") translate(" + outerRadius + ",0)"; });
groupTick.append("line")
.attr("x2", 6);
groupTick
.filter(function(d) { return d.value % 5e3 === 0; })
.append("text")
.attr("x", 8)
.attr("dy", ".35em")
.attr("transform", function(d) { return d.angle > Math.PI ? "rotate(180) translate(-16)" : null; })
.style("text-anchor", function(d) { return d.angle > Math.PI ? "end" : null; })
.text(function(d) { return formatValue(d.value); });
g.append("g")
.attr("class", "ribbons")
.selectAll("path")
.data(function(chords) { return chords; })
.enter().append("path")
.attr("d", ribbon)
.style("fill", function(d) { return color(d.target.index); })
.style("stroke", function(d) { return d3.rgb(color(d.target.index)).darker(); });
// Returns an array of tick angles and values for a given group and step.
function groupTicks(d, step) {
var k = (d.endAngle - d.startAngle) / d.value;
return d3.range(0, d.value, step).map(function(value) {
return {value: value, angle: value * k + d.startAngle};
});
}
</script>
@cemsbr
Copy link
Author

cemsbr commented Nov 14, 2016

Temos 4 portas e vamos supor que sejam de 1 a 4. Eis os Kbps enviados de cada porta:

  • 1: envia 1 Kbps para porta 2 e 3 Kbps pra porta 3;
  • 2: não envia, apenas recebe;
  • 3: envia 2 Kbps pra 1 e 4 Kbps pra 4;
  • 4: envia 3 Kbps pra 3.

Como ler o Chord:

  • As portas são dispostas em ordem crescente no sentido horário a partir do meio dia nos arcos externos, cada uma com sua cor;
  • O tamanho dos arcos corresponde à quantidade de dados enviados pela porta;
    • Se uma porta não envia dados, o arco vira um ponto, o que se vê na segunda porta;
  • As faixas (ribbons) são bidirecionais e possuem a cor da porta que mais recebe dados.

Algumas coisas que poderíamos mudar:

  • Cores (podemos ver no código onde estão);
  • Adicionar o número da porta no arco (creio não estar no código);
  • É possível trocar bits enviados por recebidos apenas usando a matriz transposta;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment