// data source: http://www.gutenberg.org/cache/epub/1342/pg1342.txt alphabet = 'abcdefghijklmnopqrstuvwxyz'.split(''); keys = {}; for (var i = 0; i < alphabet.length; ++i) { keys[alphabet[i]] = i; } dataset = []; for (var i = 0; i < alphabet.length; ++i) { dataset.push(0); } d3.text("z_pride_and_prejudice.txt", "text/plain", function(error, text) { words = text.split(" "); words.forEach(function(word) { word = word.toLowerCase(); if (word.charAt(0).match(/[a-z]/)) { dataset[keys[word.charAt(0)]] += 1; } }); var padding = 5; var svgWidth = 250; var svgHeight = 250; var nCols = 4; var nRows = Math.ceil(alphabet.length / nCols); var svg = d3.select("body") .append("svg") .attr("width", svgWidth) .attr("height", svgHeight) .attr("id", "canvas"); var tileWidth = svgWidth / nCols; var tileHeight = svgHeight / nRows; tiles = svg.selectAll(".tile") .data(dataset) .enter() .append("g") .attr("transform", function(d, i) { var x = tileWidth * (i % nCols); var y = tileHeight * Math.floor(i / nCols); return "translate(" + x + "," + y + ")"; }) .attr("class", "tile"); tiles.append("rect") .attr("x", 0) .attr("y", 0) .attr("width", tileWidth) .attr("height", tileHeight) .attr("style", "fill: none;"); var yCenter = tileHeight / 1.65; var xOffset = 10.0; tiles.append("text") .text(function(d, i) { return alphabet[i].toUpperCase() + " : " + d; }) .attr("transform", "translate(" + xOffset + "," + yCenter + ")"); });