Simple line graph demo code.
The underlying data is an array of objects with
x
and
y
properties of type Number.
Change the data and the graph will update when focus is lost on the text area.
Script listing
<script type="text/javascript">
(function() {
var maxMin = function(data, prop) {
var min, max;
for (i = 0; i < data.length; i++) {
if (min !== undefined) {
min = data[i][prop] < min ? data[i][prop] : min;
max = data[i][prop] > max ? data[i][prop] : max;
} else {
min = data[i][prop];
max = data[i][prop];
}
}
return {
min : min,
max : max,
range : max - min
};
};
var update = function() {
var data = eval(document.getElementById("graph_data").value.trim());
var canvas = document.getElementById("graph_canvas");
if (typeof canvas.getContext !== "function") {
document.getElementById("graph_err").innerHTML = "CANVAS NOT SUPPORTED";
}
canvas.width = canvas.width;
var context = canvas.getContext("2d");
context.fillStyle = "#DDD";
context.fillRect(0, 0, canvas.width, canvas.height);
var xRng = maxMin(data, "x");
var yRng = maxMin(data, "y");
var last;
var BORDER = 10;
var xRatio = xRng.range / (canvas.width - 2 * BORDER)
var yRatio = yRng.range / (canvas.height - 2 * BORDER);
for (i = 0; i < data.length; i++) {
var d = data[i];
var x = (d.x - xRng.min) / xRatio;
var y = (d.y - yRng.min) / yRatio;
if (last) {
context.moveTo(x + BORDER, canvas.height - y - BORDER);
context.lineTo(last.x + BORDER, canvas.height - last.y - BORDER);
}
last = {
x : x,
y : y
};
}
context.strokeStyle = "#000";
context.stroke();
};
update();
document.getElementById("graph_data").onchange = update;
}())
</script>
No comments:
Post a Comment
All comments are moderated