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"]} | |
] | |
} | |