blob: 0be7e3cb84572daa18baa666c01f17aa3f590ed9 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Magical waves in numbers</title>
<script type="text/javascript" src="d3/d3.v3.js"></script>
<style type="text/css">
.axis path,
.axis line {
fill: none;
stroke: black;
shape-rendering: crispEdges;
}
.axis text {
font-family: sans-serif;
font-size: 11px;
}
</style>
</head>
<body>
<script type="text/javascript">
var debug = true;
function log(o) {
if (debug) {
console.log(o);
}
}
// TODO(katepek): Find better values; currently for 13" screen.
var width = 1350;
var height = 650;
var padding = 20;
var dataset;
var seqScale;
var rateScale;
var pcapSecsScale;
d3.csv('imaginary.data', function(error, data) {
if (error) {
console.log(error);
} else {
console.log(data);
dataset = data;
init();
visualize();
}
});
function init() {
pcapSecsScale = d3.scale
.linear()
.domain([
d3.min(dataset,
function(d) { return parseFloat(d['pcap_secs']); }),
d3.max(dataset,
function(d) { return parseFloat(d['pcap_secs']); })
])
.range([2 * padding, width - 2 * padding]);
seqScale = d3.scale
.linear()
.domain([
d3.min(dataset,
function(d) { return Number(d['seq']); }),
d3.max(dataset,
function(d) { return Number(d['seq']); })
])
.range([height - padding, padding]);
rateScale = d3.scale
.linear()
.domain([
d3.min(dataset,
function(d) { return Number(d['rate']); }),
d3.max(dataset,
function(d) { return Number(d['rate']); })
])
.range([height - padding, padding]);
}
function seq(d) {
var seq = seqScale(Number(d['seq']));
log('seq = ' + seq);
return seq;
}
function rate(d) {
var rate = rateScale(Number(d['rate']));
log('rate = ' + rate);
return rate;
}
function pcapSecs(d) {
var pcapSecs = pcapSecsScale(parseFloat(d['pcap_secs']));
log('pcapSecs = ' + pcapSecs);
return pcapSecs;
}
function visualize() {
var svg = d3
.select('body')
.append('svg')
.attr('width', width)
.attr('height', height);
// .style("border", "1px solid black")
;
// Plot pcapSecs vs. rate
svg
.selectAll('pcap_vs_rate')
.data(dataset)
.enter()
.append('circle')
.attr('cx', pcapSecs)
.attr('cy', rate)
.attr('r', 1)
.append('title')
.text(
function(d) {
return d['typestr']
+ ': pcapSecs='
+ d['pcap_secs']
+ '; rate='
+ d['rate'];
});
;
// Plot pcapSecs vs. seq
svg
.selectAll('pcap_vs_seq')
.data(dataset)
.enter()
.append('circle')
.attr('cx', pcapSecs)
.attr('cy', seq)
.attr('r', 1)
.attr('fill', 'red')
.append('title')
.text(
function(d) {
return d['typestr']
+ ': pcapSecs='
+ d['pcap_secs']
+ '; seq='
+ d['seq'];
});
;
var pcapSecsAxis = d3.svg.axis()
.scale(pcapSecsScale)
.orient('bottom')
.ticks(5);
var rateAxis = d3.svg.axis()
.scale(rateScale)
.orient('left')
.ticks(5);
var seqAxis = d3.svg.axis()
.scale(seqScale)
.orient('right')
.ticks(5);
svg.append('g')
.attr('class', 'axis')
.attr('transform', 'translate(0,' + (height - padding) + ')')
.call(pcapSecsAxis);
svg.append('g')
.attr('class', 'axis')
.attr('transform', 'translate(' + 2 * padding + ',0)')
.call(rateAxis);
svg.append('g')
.attr('class', 'axis')
.attr('fill', 'red')
.attr('transform', 'translate(' + (width - 2 * padding) + ',0)')
.call(seqAxis);
}
</script>
</body>
</html>