D3 Diagrams
for use in this tutorial
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
DOM
svg
select all <circle> elements in the svg
Data
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
horizontal position
vertical position
Data
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
DOM
svg
select all <circle> elements in the svg
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
// id:1
// id:2
// id:3
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
The data-join
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
The data-join
// id:1
// id:2
// id:3
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
svg
Select the element in which you want to represent your data
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
svg
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
Make a selection that you want to bind your data to
svg
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
Bind data to your selection
// id:1
// id:2
// id:3
svg
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
Identify elements that have entered your data (i.e., not represented in the DOM)
// id:1
// id:2
// id:3
svg
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
For each element in your data not on your DOM, append a new circle
id:1
id:2
id:3
svg
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
returns elements in the data not on the DOM
// id:1
// id:2
enter
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
];
returns elements on the DOM not in the data
// id:1
// id:2
exit
// id:3
Data
DOM
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
returns elements in the data and on the DOM
// id:1
// id:2
data
// id:3
var svg = d3.select('#my-svg'); // select svg by id
var selection = svg.selectAll('circle') // select all circles in svg
var circles = selection.data(data) // bind data to selection of circles
var entering = circles.enter(); // determine which data is not on the screen
entering.append('circle'); // append a circle for each entering element
// More concisely / typical
var svg = d3.select('#my-svg'); // select svg by id
var circles = svg.selectAll('circle') // select all circles in svg
.data(data) // bind data to selection of circles
circles.enter().append('circle'); // append a circle for each entering element
// Dataset you want to visualize.
var data = [
{id:1, x:10, y:10},
{id:2, x:20, y:20},
{id:3, x:30, y:30}
];
// Select an SVG from the DOM
var svg = d3.select('#my-svg');
// Store the data-join in a variable `circles`
var circles = svg.selectAll('circle') // select all circles in the svg
.data(data, function(d){return d.id}); // bind the data to your selection
// Append a circle element for each observation that added the data. These will now be stored in the `circles` array.
circles.enter()
.append('circle');
// Manipulate the visual attributes of updating and entering elements
circles.attr('r', 5) // set a constant radius of 5
.attr('cx', function(d) {return d.x}) // specify the x attribute
.attr('cy', function(d) {return d.y}); // specify the y attribute
// Remove any exiting elements
circles.exit().remove();
// Define a linear scale
var scale = d3.scale.linear();
// Set the data domain of your scale
scale.domain([0, 10000]);
// Set the visual range of your scale
scale.range([0, 600]);
// Use your scale to translate between data space and visual space
scale(0) // returns 0 pixels
scale(5000) // returns 300 pixels
scale(10000) // returns 600 pixels
// Data to visualize
var data = [{name:'Steph', age:29}, {name:'Kristen', age:55}, {name:'Winston', age:12}];
// Get minimum age in dataset
var minAge = d3.min(data, function(d) {return d.age})
// Get maximum age in dataset
var maxAge = d3.max(data, function(d) {return d.age})
// Define an age-scale using these values
var ageScale = d3.scale.linear()
.domain([minAge, maxAge])
.range([0, 500])
// Function to update visual elements
var draw = function(data) {
// Set your scales using the current data
setScales(data);
// Define axis functions and render axes on the screen
setAxes();
// Perform your data join
var bars = g.selectAll('rect').data(data);
// Enter elements
bars.enter().append('rect');
// Update elements
bars.attr(...);
// Exit elements
bars.exit().remove();
};
var filterData = function() {
currentData = allData.filter(function(d) {
return d.type == type && d.sex == sex
}).sort(function(a,b){
if(a.state_name < b.state_name) return -1;
if(a.state_name > b.state_name) return 1;
return 0;
});
};
// simplified, commented
d3.svg.axis = function() {
var orient;
// Axis function that gets returned, operates on a selected g element
function axis(g) {
// Loop through g elements
g.each(function() {
var g = d3.select(this); // select element that called function
// Build visual axis components
}
// Expose scale getter/setter
axis.scale = function(x) {
if (!arguments.length) return scale;
scale = x;
return axis;
};
// Expose orient getter/setter
axis.orient = function(x) {
if (!arguments.length) return orient;
orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient;
return axis;
};
// Assign a few more getter/setters
return axis;
};
d3-diagrams
By Michael Freeman
d3-diagrams
- 1,586