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.
forked from emeeks's block: Ch. 10, Fig. 3 - D3.js in Action
| license: mit |
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.
forked from emeeks's block: Ch. 10, Fig. 3 - D3.js in Action
| <html> | |
| <head> | |
| <title>D3 in Action Chapter 10 - Example 1</title> | |
| <meta charset="utf-8" /> | |
| <script src="http://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", "tomato") | |
| var doubledArray = null; | |
| setTimeout(()=>{ | |
| var fakeTweets = [] | |
| for (x = 0;x<12;x++) { | |
| var tweet = {id: x, content: "Fake Tweet #" + x}; | |
| fakeTweets.push(tweet); | |
| } | |
| var newData = doubledArray || data | |
| doubledArray = newData.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)}) | |
| }, 2000) | |
| } | |
| 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": [ | |
| {"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"]} | |
| ] | |
| } | |