block by emeeks adc7b0baa616009327b9

Ch. 10, Fig. 3 - D3.js in Action

Full Screen

This is the code for Chapter 10, Figure 3 from D3.js in Action demonstrating the d3.layout.grid() layout created in this chapter as it adjusts in size with more data added.

index.html

<html>
<head>
  <title>D3 in Action Chapter 10 - Example 1</title>
  <meta charset="utf-8" />
<script src="//d3js.org/colorbrewer.v1.min.js" type="text/JavaScript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
</head>
<style>
  svg {
    height: 500px;
    width: 500px;
    border: 1px solid gray;
  }
</style>
<body>
  <div id="viz">
  <svg></svg>
</div>
</body>
  <footer>
    
<script>
  
  d3.json("tweets.json", function(error, data) {
      makeAGrid(data);
    })
  
  function makeAGrid(data) {
    var scale = d3.scale.linear().domain([0,5]).range([100,400]);
    var grid = d3.layout.grid()
    var griddedData = grid(data.tweets);

    d3.select("svg").selectAll("circle").data(griddedData)
    .enter()
    .append("circle")
    .attr("cx", function(d) {return scale(d.x)})
    .attr("cy", function(d) {return scale(d.y)})
    .attr("r", 20)
    .style("fill", "pink")
    
    var fakeTweets = []
    for (x = 0;x<12;x++) {
      var tweet = {id: x, content: "Fake Tweet #" + x};
      fakeTweets.push(tweet);
    }
      var doubledArray = data.tweets.concat(fakeTweets);
    
      var newGriddedData = grid(doubledArray);

    d3.select("svg").selectAll("circle").data(newGriddedData)    
    .enter()
    .append("circle")
    .attr("cx", 0)
    .attr("cy", 0)
    .attr("r", 20)
    .style("fill", "darkred");

    d3.select("svg").selectAll("circle")
    .transition()
    .duration(1000)
    .attr("cx", function(d) {return scale(d.x)})
    .attr("cy", function(d) {return scale(d.y)})

  }
  
  d3.layout.grid = function() {
  var gridSize = [10,10];
  var gridColumns;
  var gridRows;

    function processGrid(data) {

      var rows = Math.ceil(Math.sqrt(data.length));
      var columns = Math.ceil(Math.sqrt(data.length));

      var x = 0;

        for (i = 0; i < rows; i++) { 
          for (j = 0; j < columns; j++) {
            if (data[x]) {
              data[x].x = j;
              data[x].y = i;
              x++;
            }
            else {
              break;
            }
          }
        }
      
      return data;
    }
    
    processGrid.size = function(newSize) {
      	if (!arguments.length) return gridSize;

        gridSize = newSize;
        return this;
    }

    return processGrid;
  }
</script>
  </footer>

</html>

tweets.json

{
"tweets": [
{"user": "Al", "content": "I really love seafood.", "timestamp": " Mon Dec 23 2013 21:30 GMT-0800 (PST)", "retweets": ["Raj","Pris","Roy"], "favorites": ["Sam"]},
{"user": "Al", "content": "I take that back, this doesn't taste so good.", "timestamp": "Mon Dec 23 2013 21:55 GMT-0800 (PST)", "retweets": ["Roy"], "favorites": []},
{"user": "Al", "content": "From now on, I'm only eating cheese sandwiches.", "timestamp": "Mon Dec 23 2013 22:22 GMT-0800 (PST)", "retweets": [], "favorites": ["Roy","Sam"]},
{"user": "Roy", "content": "Great workout!", "timestamp": " Mon Dec 23 2013 7:20 GMT-0800 (PST)", "retweets": [], "favorites": []},
{"user": "Roy", "content": "Spectacular oatmeal!", "timestamp": " Mon Dec 23 2013 7:23 GMT-0800 (PST)", "retweets": [], "favorites": []},
{"user": "Roy", "content": "Amazing traffic!", "timestamp": " Mon Dec 23 2013 7:47  GMT-0800 (PST)", "retweets": [], "favorites": []},
{"user": "Roy", "content": "Just got a ticket for texting and driving!", "timestamp": " Mon Dec 23 2013 8:05 GMT-0800 (PST)", "retweets": [], "favorites": ["Sam", "Sally", "Pris"]},
{"user": "Pris", "content": "Going to have some boiled eggs.", "timestamp": " Mon Dec 23 2013 18:23 GMT-0800 (PST)", "retweets": [], "favorites": ["Sally"]},
{"user": "Pris", "content": "Maybe practice some gymnastics.", "timestamp": " Mon Dec 23 2013 19:47  GMT-0800 (PST)", "retweets": [], "favorites": ["Sally"]},
{"user": "Sam", "content": "@Roy Let's get lunch", "timestamp": " Mon Dec 23 2013 11:05 GMT-0800 (PST)", "retweets": ["Pris"], "favorites": ["Sally", "Pris"]}
]
}