first commit
This commit is contained in:
@@ -0,0 +1,252 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - difference line chart
|
||||
*
|
||||
* Demo d3.js difference line chart setup with .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
difference('#d3-difference', 400);
|
||||
|
||||
// Chart setup
|
||||
function difference(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 10, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var parseDate = d3.time.format("%Y%m%d").parse;
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(6);
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3Container.append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Line
|
||||
var line = d3.svg.area()
|
||||
.interpolate("basis")
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y(function(d) { return y(d["New York"]); });
|
||||
|
||||
// Area
|
||||
var area = d3.svg.area()
|
||||
.interpolate("basis")
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y1(function(d) { return y(d["New York"]); });
|
||||
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.tsv("assets/demo_data/d3/lines/lines_difference.tsv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = parseDate(d.date);
|
||||
d["New York"]= +d["New York"];
|
||||
d["San Francisco"] = +d["San Francisco"];
|
||||
});
|
||||
|
||||
// Bind data
|
||||
svg.datum(data);
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain(d3.extent(data, function(d) { return d.date; }));
|
||||
|
||||
// Vertical
|
||||
y.domain([
|
||||
d3.min(data, function(d) { return Math.min(d["New York"], d["San Francisco"]); }),
|
||||
d3.max(data, function(d) { return Math.max(d["New York"], d["San Francisco"]); })
|
||||
]);
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add masks
|
||||
// ------------------------------
|
||||
|
||||
svg.append("clipPath")
|
||||
.attr("id", "clip-below")
|
||||
.append("path")
|
||||
.attr("d", area.y0(height));
|
||||
|
||||
svg.append("clipPath")
|
||||
.attr("id", "clip-above")
|
||||
.append("path")
|
||||
.attr("d", area.y0(0));
|
||||
|
||||
svg.append("path")
|
||||
.attr("class", "area mask-above")
|
||||
.attr("clip-path", "url(#clip-above)")
|
||||
.attr("fill", "#FF8A65")
|
||||
.attr("d", area.y0(function(d) { return y(d["San Francisco"]); }));
|
||||
|
||||
svg.append("path")
|
||||
.attr("class", "area mask-below")
|
||||
.attr("clip-path", "url(#clip-below)")
|
||||
.attr("fill", "#9CCC65")
|
||||
.attr("d", area);
|
||||
|
||||
|
||||
// Add line
|
||||
svg.append("path")
|
||||
.attr("class", "d3-line d3-line-medium")
|
||||
.style("stroke", "#558B2F")
|
||||
.attr("d", line);
|
||||
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
var verticalAxis = svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
// Add text label
|
||||
verticalAxis.append("text")
|
||||
.attr("transform", "rotate(-90)")
|
||||
.attr("y", 10)
|
||||
.attr("dy", ".71em")
|
||||
.style("text-anchor", "end")
|
||||
.style("fill", "#999")
|
||||
.style("font-size", 12)
|
||||
.text("Temperature (ºF)");
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", line);
|
||||
|
||||
|
||||
// Bottom clip
|
||||
svg.select('#clip-below path').attr("d", area.y0(height));
|
||||
|
||||
// Top clip
|
||||
svg.select('#clip-above path').attr("d", area.y0(0));
|
||||
|
||||
|
||||
// Top mask
|
||||
svg.select('.mask-above').attr("d", area.y0(function(d) { return y(d["San Francisco"]); }))
|
||||
|
||||
// Bottom mask
|
||||
svg.select('.mask-below').attr("d", area);
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
+213
@@ -0,0 +1,213 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - area chart with missing data
|
||||
*
|
||||
* Demo d3.js area chart setup with tooltip and missing data
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
areaMissing('#d3-missing-data', 400);
|
||||
|
||||
// Chart setup
|
||||
function areaMissing(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 20, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Data set
|
||||
var data = d3.range(60).map(function(i) {
|
||||
return {x: i / 59, y: i % 5 ? (Math.sin(i / 3) + 2) / 4 : null};
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.scale.linear()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom");
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
// Add tooltip
|
||||
var tip = d3.tip()
|
||||
.attr('class', 'd3-tip')
|
||||
.offset([-10, 0])
|
||||
.html(function(d) {
|
||||
return d.x;
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3Container.append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.datum(data)
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
|
||||
.call(tip);
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Line
|
||||
var line = d3.svg.line()
|
||||
.defined(function(d) { return d.y != null; })
|
||||
.x(function(d) { return x(d.x); })
|
||||
.y(function(d) { return y(d.y); });
|
||||
|
||||
// Area
|
||||
var area = d3.svg.area()
|
||||
.defined(line.defined())
|
||||
.x(line.x())
|
||||
.y1(line.y())
|
||||
.y0(y(0));
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// ------------------------------
|
||||
|
||||
// Add area
|
||||
svg.append("path")
|
||||
.attr("class", "d3-area")
|
||||
.attr("d", area)
|
||||
.style("fill", "#81C784");
|
||||
|
||||
|
||||
// Add line
|
||||
svg.append("path")
|
||||
.attr("class", "d3-line d3-line-medium")
|
||||
.attr("d", line)
|
||||
.style("stroke", "#43A047");
|
||||
|
||||
// Add dots
|
||||
svg.selectAll(".d3-dot")
|
||||
.data(data.filter(function(d) { return d.y; }))
|
||||
.enter()
|
||||
.append("circle")
|
||||
.attr("class", "d3-dot")
|
||||
.attr("cx", line.x())
|
||||
.attr("cy", line.y())
|
||||
.attr("r", 3)
|
||||
.style("fill", "#fff")
|
||||
.style("stroke", "#43A047")
|
||||
.style("stroke-width", 1.5)
|
||||
.on('mouseover', tip.show)
|
||||
.on('mouseout', tip.hide);
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", line);
|
||||
|
||||
// Area path
|
||||
svg.selectAll('.d3-area').attr("d", area);
|
||||
|
||||
// Dots
|
||||
svg.selectAll('.d3-dot').attr("cx", line.x());
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,180 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - small multiples chart
|
||||
*
|
||||
* Demo d3.js small multiples chart setup with .csv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
smallMultiples('#d3-small-multiples', 100);
|
||||
|
||||
// Chart setup
|
||||
function smallMultiples(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 10, bottom: 5, left: 10},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var parseDate = d3.time.format("%b %Y").parse;
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Area
|
||||
var area = d3.svg.area()
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y0(height)
|
||||
.y1(function(d) { return y(d.price); });
|
||||
|
||||
// Line
|
||||
var line = d3.svg.line()
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y(function(d) { return y(d.price); });
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.csv("assets/demo_data/d3/lines/lines_small_multiples.csv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.price = +d.price;
|
||||
d.date = parseDate(d.date);
|
||||
})
|
||||
|
||||
// Nest data by symbol
|
||||
var symbols = d3.nest()
|
||||
.key(function(d) { return d.symbol; })
|
||||
.entries(data);
|
||||
|
||||
// Compute the maximum price per symbol, needed for the y-domain.
|
||||
symbols.forEach(function(s) {
|
||||
s.maxPrice = d3.max(s.values, function(d) { return d.price; });
|
||||
});
|
||||
|
||||
// Compute the minimum and maximum date across symbols.
|
||||
// We assume values are sorted by date.
|
||||
x.domain([
|
||||
d3.min(symbols, function(s) { return s.values[0].date; }),
|
||||
d3.max(symbols, function(s) { return s.values[s.values.length - 1].date; })
|
||||
]);
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG elements
|
||||
var svg = d3Container.selectAll("svg")
|
||||
.data(symbols)
|
||||
.enter()
|
||||
.append("svg")
|
||||
.attr("class", "multiples")
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add area
|
||||
svg.append("path")
|
||||
//.attr("class", function(d) {return d.key.toLowerCase();})
|
||||
.attr("d", function(d) { y.domain([0, d.maxPrice]); return area(d.values); })
|
||||
.attr("class", "d3-area")
|
||||
.style("fill", "#81D4FA");
|
||||
|
||||
// Add line
|
||||
svg.append("path")
|
||||
.attr("d", function(d) { y.domain([0, d.maxPrice]); return line(d.values); })
|
||||
.attr("class", "d3-line")
|
||||
.style("stroke", "rgba(0,0,0,0.5)");
|
||||
|
||||
// Add name label
|
||||
svg.append("text")
|
||||
.attr("class", "multiples-label")
|
||||
.attr("x", width - 8)
|
||||
.attr("y", height - 8)
|
||||
.style("fill", "#fff")
|
||||
.style("text-anchor", "end")
|
||||
.style("text-weight", 500)
|
||||
.text(function(d) { return d.key; });
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Resize all multiples
|
||||
d3.selectAll(".multiples").attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", function(d) { y.domain([0, d.maxPrice]); return line(d.values); })
|
||||
|
||||
// Area path
|
||||
svg.selectAll('.d3-area').attr("d", function(d) { y.domain([0, d.maxPrice]); return area(d.values); });
|
||||
|
||||
// Text label
|
||||
svg.selectAll('.multiples-label').attr("x", width - 8);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,208 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - spline transition
|
||||
*
|
||||
* Demo d3.js line chart setup with spline transition
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
splineTrransition('#d3-spline-transition', 400);
|
||||
|
||||
// Chart setup
|
||||
function splineTrransition(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 5, bottom: 5, left: 30},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Add data
|
||||
var n = 50,
|
||||
random = d3.random.normal(0, .35),
|
||||
data = d3.range(n).map(random);
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.scale.linear()
|
||||
.domain([1, n - 2])
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.domain([-1, 1])
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom");
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3Container.append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Line
|
||||
var line = d3.svg.line()
|
||||
.interpolate("basis")
|
||||
.x(function(d, i) { return x(i); })
|
||||
.y(function(d, i) { return y(d); });
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add mask
|
||||
svg.append("defs")
|
||||
.append("clipPath")
|
||||
.attr("id", "transition-clip")
|
||||
.append("rect")
|
||||
.attr("width", width)
|
||||
.attr("height", height);
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + y(0) + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
|
||||
// Add line
|
||||
var path = svg.append("g")
|
||||
.attr("clip-path", "url(#transition-clip)")
|
||||
.append("path")
|
||||
.datum(data)
|
||||
.attr("d", line)
|
||||
.attr("class", "d3-line d3-line-medium")
|
||||
.style("stroke", "#607D8B");
|
||||
|
||||
|
||||
// Transition
|
||||
// ------------------------------
|
||||
|
||||
// Initialize transition
|
||||
tick();
|
||||
|
||||
// Setup transition
|
||||
function tick() {
|
||||
|
||||
// push a new data point onto the back
|
||||
data.push(random());
|
||||
|
||||
// redraw the line, and slide it to the left
|
||||
path
|
||||
.attr("d", line)
|
||||
.attr("transform", null)
|
||||
.transition()
|
||||
.duration(500)
|
||||
.ease("linear")
|
||||
.attr("transform", "translate(" + x(0) + ",0)")
|
||||
.each("end", tick);
|
||||
|
||||
// pop the old data point off the front
|
||||
data.shift();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", line);
|
||||
|
||||
// Crosshair
|
||||
svg.selectAll('#transition-clip rect').attr("width", width);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,259 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - line chart with chained transitions
|
||||
*
|
||||
* Demo d3.js line chart setup with chained transitions and .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Create Uniform checkbox
|
||||
$(".chained").uniform({
|
||||
radioClass: 'choice',
|
||||
wrapperClass: 'border-teal'
|
||||
});
|
||||
|
||||
// Initialize chart
|
||||
chainedTransitions('#d3-chained-transitions', 400);
|
||||
|
||||
// Chart setup
|
||||
function chainedTransitions(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 90, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
|
||||
// City name
|
||||
var city = "New York";
|
||||
|
||||
// Format data
|
||||
parseDate = d3.time.format("%Y%m%d").parse;
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(6)
|
||||
.tickFormat(d3.time.format("%b"));
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3Container.append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Line
|
||||
var line = d3.svg.line()
|
||||
.interpolate("basis")
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y(function(d) { return y(d[city]); });
|
||||
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.tsv("assets/demo_data/d3/lines/lines_transitions.tsv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = parseDate(d.date);
|
||||
d["New York"] = +d["New York"];
|
||||
d["San Francisco"] = +d["San Francisco"];
|
||||
});
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain([data[0].date, data[data.length - 1].date]);
|
||||
|
||||
// Vertical
|
||||
y.domain(d3.extent(data, function(d) { return d[city]; }));
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add line
|
||||
svg.append("path")
|
||||
.datum(data)
|
||||
.attr("d", line)
|
||||
.attr("class", "d3-line d3-line-medium")
|
||||
.style("stroke", "#FF5722");
|
||||
|
||||
|
||||
// Add text
|
||||
svg.append("text")
|
||||
.datum(data[data.length - 1])
|
||||
.attr("class", "d3-city")
|
||||
.attr("transform", transform)
|
||||
.attr("x", 3)
|
||||
.attr("dy", ".35em")
|
||||
.text(city);
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
var verticalAxis = svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
// Add text label
|
||||
verticalAxis.append("text")
|
||||
.attr("transform", "rotate(-90)")
|
||||
.attr("y", 10)
|
||||
.attr("dy", ".71em")
|
||||
.style("text-anchor", "end")
|
||||
.style("fill", "#999")
|
||||
.style("font-size", 12)
|
||||
.text("Temperature (ºF)");
|
||||
|
||||
|
||||
// Transitions
|
||||
// ------------------------------
|
||||
|
||||
// Do stuff on value change
|
||||
d3.selectAll(".chained").on("change", change);
|
||||
|
||||
// Set timeout for auto change
|
||||
var timeout = setTimeout(function() {
|
||||
d3.select("input[value=\"San Francisco\"]").property("checked", true).each(change);
|
||||
$.uniform.update();
|
||||
}, 3000);
|
||||
|
||||
// Change function
|
||||
function change() {
|
||||
clearTimeout(timeout);
|
||||
city = this.value;
|
||||
|
||||
// First transition the line & label to the new city.
|
||||
var t0 = svg.transition().duration(750);
|
||||
t0.selectAll(".d3-line").attr("d", line);
|
||||
t0.selectAll(".d3-city").attr("transform", transform).text(city);
|
||||
|
||||
// Then transition the y-axis.
|
||||
y.domain(d3.extent(data, function(d) { return d[city]; }));
|
||||
var t1 = t0.transition();
|
||||
t1.selectAll(".d3-line").attr("d", line);
|
||||
t1.selectAll(".d3-city").attr("transform", transform);
|
||||
t1.selectAll(".d3-axis-vertical").call(yAxis);
|
||||
}
|
||||
|
||||
// Transform text
|
||||
function transform(d) {
|
||||
return "translate(" + x(d.date) + "," + y(d[city]) + ")";
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", line);
|
||||
|
||||
// Text
|
||||
svg.selectAll(".d3-city").attr("transform", transform);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
+265
@@ -0,0 +1,265 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - line chart with pan and zoom
|
||||
*
|
||||
* Demo d3.js line chart setup with pan and zoom
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
panZoom('#d3-pan-zoom', 400);
|
||||
|
||||
// Chart setup
|
||||
function panZoom(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Demo data set
|
||||
var data = [
|
||||
[{'x':1,'y':0},{'x':2,'y':5},{'x':3,'y':10},{'x':4,'y':0},{'x':5,'y':6},{'x':6,'y':11},{'x':7,'y':9},{'x':8,'y':4},{'x':9,'y':11},{'x':10,'y':2}],
|
||||
[{'x':1,'y':1},{'x':2,'y':6},{'x':3,'y':11},{'x':4,'y':1},{'x':5,'y':7},{'x':6,'y':12},{'x':7,'y':8},{'x':8,'y':3},{'x':9,'y':13},{'x':10,'y':3}],
|
||||
[{'x':1,'y':2},{'x':2,'y':7},{'x':3,'y':12},{'x':4,'y':2},{'x':5,'y':8},{'x':6,'y':13},{'x':7,'y':7},{'x':8,'y':2},{'x':9,'y':4},{'x':10,'y':7}]
|
||||
];
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 20, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Colors
|
||||
var colors = ['#EF5350', '#5C6BC0', '#66BB6A']
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.scale.linear()
|
||||
.domain([0, 11])
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.domain([-1, 14])
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.tickSize(-height)
|
||||
.tickPadding(10)
|
||||
.tickSubdivide(true)
|
||||
.orient("bottom");
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.tickPadding(10)
|
||||
.tickSize(-width)
|
||||
.tickSubdivide(true)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Add zoom
|
||||
// ------------------------------
|
||||
|
||||
var zoom = d3.behavior.zoom()
|
||||
.x(x)
|
||||
.y(y)
|
||||
.scaleExtent([1, 10])
|
||||
.on("zoom", zoomed);
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3Container.append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.call(zoom)
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Line
|
||||
var line = d3.svg.line()
|
||||
.interpolate("monotone")
|
||||
.x(function(d) { return x(d.x); })
|
||||
.y(function(d) { return y(d.y); });
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong d3-grid")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong d3-grid")
|
||||
.call(yAxis);
|
||||
|
||||
|
||||
// Append line
|
||||
// ------------------------------
|
||||
|
||||
// Add clip path
|
||||
svg.append("clipPath")
|
||||
.attr("id", "zoom-clip")
|
||||
.append("rect")
|
||||
.attr("width", width)
|
||||
.attr("height", height);
|
||||
|
||||
// Add line
|
||||
var path = svg.selectAll('.d3-line')
|
||||
.data(data)
|
||||
.enter()
|
||||
.append("path")
|
||||
.attr("d", line)
|
||||
.attr("class", "d3-line d3-line-medium")
|
||||
.attr("clip-path", "url(#zoom-clip)")
|
||||
.style('stroke', function(d,i){
|
||||
return colors[i%colors.length];
|
||||
});
|
||||
|
||||
|
||||
// Append dots
|
||||
// ------------------------------
|
||||
|
||||
// Group dots
|
||||
var points = svg.selectAll('.d3-dots')
|
||||
.data(data)
|
||||
.enter()
|
||||
.append("g")
|
||||
.attr("class", "d3-dots")
|
||||
.attr("clip-path", "url(#clip)");
|
||||
|
||||
// Add dots
|
||||
points.selectAll('.d3-dot')
|
||||
.data(function(d, index) {
|
||||
var a = [];
|
||||
d.forEach(function(point,i) {
|
||||
a.push({'index': index, 'point': point});
|
||||
});
|
||||
return a;
|
||||
})
|
||||
.enter()
|
||||
.append('circle')
|
||||
.attr('class', 'd3-dot')
|
||||
.attr("r", 3)
|
||||
.attr("transform", function(d) {
|
||||
return "translate(" + x(d.point.x) + "," + y(d.point.y) + ")"; }
|
||||
)
|
||||
.style("fill", "#fff")
|
||||
.style("stroke-width", 2)
|
||||
.style('stroke', function(d,i){
|
||||
return colors[d.index%colors.length];
|
||||
})
|
||||
.style("cursor", "pointer");
|
||||
|
||||
|
||||
// Update elements on zoom
|
||||
// ------------------------------
|
||||
|
||||
function zoomed() {
|
||||
svg.select(".d3-axis-horizontal").call(xAxis);
|
||||
svg.select(".d3-axis-vertical").call(yAxis);
|
||||
svg.selectAll('.d3-line').attr('d', line);
|
||||
|
||||
points.selectAll('.d3-dot').attr("transform", function(d) {
|
||||
return "translate(" + x(d.point.x) + "," + y(d.point.y) + ")"; }
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
svg.selectAll('.d3-axis-vertical').call(yAxis.tickSize(-width));
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Mask
|
||||
svg.select('#zoom-clip rect').attr("width", width);
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", line);
|
||||
|
||||
// Dots
|
||||
points.selectAll('.d3-dot').attr("transform", function(d) {
|
||||
return "translate(" + x(d.point.x) + "," + y(d.point.y) + ")"; }
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
+257
@@ -0,0 +1,257 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - basic line chart
|
||||
*
|
||||
* Demo d3.js line chart setup with tooltip and .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
lineBasic('#d3-line-basic', 400);
|
||||
|
||||
// Chart setup
|
||||
function lineBasic(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 20, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var parseDate = d3.time.format("%d-%b-%y").parse,
|
||||
bisectDate = d3.bisector(function(d) { return d.date; }).left,
|
||||
formatValue = d3.format(",.2f"),
|
||||
formatCurrency = function(d) { return "$" + formatValue(d); }
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(6)
|
||||
.tickFormat(d3.time.format("%b"));
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3Container.append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Line
|
||||
var line = d3.svg.line()
|
||||
.interpolate("basis")
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y(function(d) { return y(d.close); });
|
||||
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.tsv("assets/demo_data/d3/lines/lines_basic.tsv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = parseDate(d.date);
|
||||
d.close = +d.close;
|
||||
});
|
||||
|
||||
// Sort data
|
||||
data.sort(function(a, b) {
|
||||
return a.date - b.date;
|
||||
});
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain(d3.extent(data, function(d) { return d.date; }));
|
||||
|
||||
// Vertical
|
||||
y.domain([0, d3.max(data, function(d) { return d.close; })]);
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add line
|
||||
svg.append("path")
|
||||
.datum(data)
|
||||
.attr("class", "d3-line d3-line-medium")
|
||||
.attr("d", line)
|
||||
.style("fill", "none")
|
||||
.style("stroke-width", 2)
|
||||
.style("stroke", "#4CAF50");
|
||||
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
var verticalAxis = svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
// Add text label
|
||||
verticalAxis.append("text")
|
||||
.attr("transform", "rotate(-90)")
|
||||
.attr("y", 10)
|
||||
.attr("dy", ".71em")
|
||||
.style("text-anchor", "end")
|
||||
.style("fill", "#999")
|
||||
.style("font-size", 12)
|
||||
.text("Price ($)");
|
||||
|
||||
|
||||
|
||||
|
||||
// Append tooltip
|
||||
// -------------------------
|
||||
|
||||
// Group elements
|
||||
var focus = svg.append("g")
|
||||
.attr("class", "d3-crosshair-pointer")
|
||||
.style("display", "none");
|
||||
|
||||
// Pointer
|
||||
focus.append("circle")
|
||||
.attr("r", 3.5)
|
||||
.style("fill", "#fff")
|
||||
.style("stroke", "#4CAF50")
|
||||
.style("stroke-width", 2);
|
||||
|
||||
// Text
|
||||
focus.append("text")
|
||||
.attr("dy", ".35em")
|
||||
.style("fill", "#333")
|
||||
.style("stroke", "none")
|
||||
|
||||
// Overlay
|
||||
svg.append("rect")
|
||||
.attr("class", "d3-crosshair-overlay")
|
||||
.attr("width", width)
|
||||
.attr("height", height)
|
||||
.on("mouseover", function() { focus.style("display", null); })
|
||||
.on("mouseout", function() { focus.style("display", "none"); })
|
||||
.on("mousemove", mousemove);
|
||||
|
||||
// Display tooltip on mousemove
|
||||
function mousemove() {
|
||||
var x0 = x.invert(d3.mouse(this)[0]),
|
||||
i = bisectDate(data, x0, 1),
|
||||
d0 = data[i - 1],
|
||||
d1 = data[i],
|
||||
d = x0 - d0.date > d1.date - x0 ? d1 : d0;
|
||||
focus.attr("transform", "translate(" + x(d.date) + "," + y(d.close) + ")");
|
||||
focus.select("text").text(formatCurrency(d.close)).attr("dx", -26).attr("dy", 30);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", line);
|
||||
|
||||
// Crosshair
|
||||
svg.selectAll('.d3-crosshair-overlay').attr("width", width);
|
||||
}
|
||||
}
|
||||
});
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - basic area chart
|
||||
*
|
||||
* Demo d3.js area chart setup with .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
areaBasic('#d3-area-basic', 400);
|
||||
|
||||
// Chart setup
|
||||
function areaBasic(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 10, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var parseDate = d3.time.format("%d-%b-%y").parse;
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(6)
|
||||
.tickFormat(d3.time.format("%b"));
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3.select(element).append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Area
|
||||
var area = d3.svg.area()
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y0(height)
|
||||
.y1(function(d) { return y(d.close); });
|
||||
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.tsv("assets/demo_data/d3/lines/lines_basic.tsv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = parseDate(d.date);
|
||||
d.close = +d.close;
|
||||
});
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain(d3.extent(data, function(d) { return d.date; }));
|
||||
|
||||
// Vertical
|
||||
y.domain([0, d3.max(data, function(d) { return d.close; })]);
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add area
|
||||
svg.append("path")
|
||||
.datum(data)
|
||||
.attr("class", "d3-area")
|
||||
.attr("fill", "#29B6F6")
|
||||
.attr("d", area);
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
var verticalAxis = svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
// Add text label
|
||||
verticalAxis.append("text")
|
||||
.attr("transform", "rotate(-90)")
|
||||
.attr("y", 10)
|
||||
.attr("dy", ".71em")
|
||||
.style("fill", "#999")
|
||||
.style("font-size", 12)
|
||||
.style("text-anchor", "end")
|
||||
.text("Price ($)");
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Area path
|
||||
svg.selectAll('.d3-area').attr("d", area);
|
||||
}
|
||||
}
|
||||
});
|
||||
+201
@@ -0,0 +1,201 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - bivariate area chart
|
||||
*
|
||||
* Demo d3.js bivariate area chart setup with .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
areaBivariate('#d3-area-bivariate', 400);
|
||||
|
||||
// Chart setup
|
||||
function areaBivariate(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 10, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var parseDate = d3.time.format("%Y%m%d").parse;
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(6)
|
||||
.tickFormat(d3.time.format("%b"));
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3.select(element).append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Area
|
||||
var area = d3.svg.area()
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y0(function(d) { return y(d.low); })
|
||||
.y1(function(d) { return y(d.high); });
|
||||
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.tsv("assets/demo_data/d3/lines/lines_bivariate.tsv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = parseDate(d.date);
|
||||
d.low = +d.low;
|
||||
d.high = +d.high;
|
||||
});
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain(d3.extent(data, function(d) { return d.date; }));
|
||||
|
||||
// Vertical
|
||||
y.domain([d3.min(data, function(d) { return d.low; }), d3.max(data, function(d) { return d.high; })]);
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add area
|
||||
svg.append("path")
|
||||
.datum(data)
|
||||
.attr("class", "d3-area")
|
||||
.attr("fill", "#FF7043")
|
||||
.attr("d", area);
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
var verticalAxis = svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
// Add text label
|
||||
verticalAxis.append("text")
|
||||
.attr("transform", "rotate(-90)")
|
||||
.attr("y", 10)
|
||||
.attr("dy", ".71em")
|
||||
.style("fill", "#999")
|
||||
.style("font-size", 12)
|
||||
.style("text-anchor", "end")
|
||||
.text("Temperature (ºF)");
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Area path
|
||||
svg.selectAll('.d3-area').attr("d", area);
|
||||
}
|
||||
}
|
||||
});
|
||||
+220
@@ -0,0 +1,220 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - gradient encoding line chart
|
||||
*
|
||||
* Demo d3.js gradient encoding line chart setup with .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
lineGradient('#d3-line-gradient', 400);
|
||||
|
||||
// Chart setup
|
||||
function lineGradient(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 20, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var parseDate = d3.time.format("%Y%m%d").parse;
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(7)
|
||||
.tickFormat(d3.time.format("%b"));
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3Container.append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Line
|
||||
var line = d3.svg.line()
|
||||
.interpolate("basis")
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y(function(d) { return y(d.temperature); });
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.tsv("assets/demo_data/d3/lines/lines_gradient.tsv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = parseDate(d.date);
|
||||
d.temperature = +d.temperature;
|
||||
});
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain([data[0].date, data[data.length - 1].date]);
|
||||
|
||||
// Vertical
|
||||
y.domain(d3.extent(data, function(d) { return d.temperature; }));
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add gradient
|
||||
svg.append("linearGradient")
|
||||
.attr("id", "temperature-gradient")
|
||||
.attr("gradientUnits", "userSpaceOnUse")
|
||||
.attr("x1", 0)
|
||||
.attr("y1", y(50))
|
||||
.attr("x2", 0)
|
||||
.attr("y2", y(60))
|
||||
.selectAll("stop")
|
||||
.data([
|
||||
{offset: "0%", color: "#4CAF50"},
|
||||
{offset: "50%", color: "#81C784"},
|
||||
{offset: "100%", color: "#FF5722"}
|
||||
])
|
||||
.enter()
|
||||
.append("stop")
|
||||
.attr("offset", function(d) { return d.offset; })
|
||||
.attr("stop-color", function(d) { return d.color; });
|
||||
|
||||
// Add line
|
||||
svg.append("path")
|
||||
.datum(data)
|
||||
.attr("class", "d3-line d3-line-medium")
|
||||
.attr("fill", "none")
|
||||
.attr("stroke", "url(#temperature-gradient)")
|
||||
.attr("stroke-width", 2)
|
||||
.attr("d", line);
|
||||
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
var verticalAxis = svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
// Add text label
|
||||
verticalAxis.append("text")
|
||||
.attr("transform", "rotate(-90)")
|
||||
.attr("y", 10)
|
||||
.attr("dy", ".71em")
|
||||
.style("text-anchor", "end")
|
||||
.style("fill", "#999")
|
||||
.style("font-size", 12)
|
||||
.text("Temperature (ºF)");
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", line);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,242 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - multi series line chart
|
||||
*
|
||||
* Demo d3.js multi series line chart setup with .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
lineBasic('#d3-line-multi-series', 400);
|
||||
|
||||
// Chart setup
|
||||
function lineBasic(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 100, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var parseDate = d3.time.format("%Y%m%d").parse;
|
||||
|
||||
// Colors
|
||||
var color = d3.scale.category10();
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(5)
|
||||
.tickFormat(d3.time.format("%b"));
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3Container.append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Line
|
||||
var line = d3.svg.line()
|
||||
.interpolate("basis")
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y(function(d) { return y(d.temperature); });
|
||||
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.tsv("assets/demo_data/d3/lines/lines_multi_series.tsv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = parseDate(d.date);
|
||||
});
|
||||
|
||||
|
||||
// Set color domains
|
||||
// ------------------------------
|
||||
|
||||
// Filter by date
|
||||
color.domain(d3.keys(data[0]).filter(function(key) { return key !== "date"; }));
|
||||
|
||||
// Set colors
|
||||
var cities = color.domain().map(function(name) {
|
||||
return {
|
||||
name: name,
|
||||
values: data.map(function(d) {
|
||||
return {date: d.date, temperature: +d[name]};
|
||||
})
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain(d3.extent(data, function(d) { return d.date; }));
|
||||
|
||||
// Vertical
|
||||
y.domain([
|
||||
d3.min(cities, function(c) { return d3.min(c.values, function(v) { return v.temperature; }); }),
|
||||
d3.max(cities, function(c) { return d3.max(c.values, function(v) { return v.temperature; }); })
|
||||
]);
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Bind data
|
||||
var city = svg.selectAll(".multiline-city")
|
||||
.data(cities)
|
||||
.enter()
|
||||
.append("g")
|
||||
.attr("class", "multiline-city");
|
||||
|
||||
// Add line
|
||||
city.append("path")
|
||||
.attr("class", "d3-line d3-line-medium")
|
||||
.attr("d", function(d) { return line(d.values); })
|
||||
.style("stroke", function(d) { return color(d.name); });
|
||||
|
||||
// Add text
|
||||
city.append("text")
|
||||
.datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; })
|
||||
.attr("transform", function(d) { return "translate(" + x(d.value.date) + "," + y(d.value.temperature) + ")"; })
|
||||
.attr("class", "d3-cities")
|
||||
.attr("x", 10)
|
||||
.attr("dy", ".35em")
|
||||
.text(function(d) { return d.name; });
|
||||
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
var verticalAxis = svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
|
||||
// Add text label
|
||||
verticalAxis.append("text")
|
||||
.attr("transform", "rotate(-90)")
|
||||
.attr("y", 10)
|
||||
.attr("dy", ".71em")
|
||||
.style("text-anchor", "end")
|
||||
.style("fill", "#999")
|
||||
.style("font-size", 12)
|
||||
.text("Temperature (ºF)");
|
||||
})
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-line').attr("d", function(d) { return line(d.values); });
|
||||
|
||||
// Text
|
||||
svg.selectAll('.d3-cities').attr("transform", function(d) { return "translate(" + x(d.value.date) + "," + y(d.value.temperature) + ")"; })
|
||||
}
|
||||
}
|
||||
});
|
||||
+232
@@ -0,0 +1,232 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - stacked area chart
|
||||
*
|
||||
* Demo d3.js stacked area chart setup with .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
areaStacked('#d3-area-stacked', 400);
|
||||
|
||||
// Chart setup
|
||||
function areaStacked(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 10, bottom: 20, left: 40},
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var parseDate = d3.time.format("%y-%b-%d").parse,
|
||||
formatPercent = d3.format(".0%");
|
||||
|
||||
// Colors
|
||||
var color = d3.scale.category20();
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(6)
|
||||
.tickFormat(d3.time.format("%b"));
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left")
|
||||
.tickFormat(formatPercent);
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3.select(element).append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Area
|
||||
var area = d3.svg.area()
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y0(function(d) { return y(d.y0); })
|
||||
.y1(function(d) { return y(d.y0 + d.y); });
|
||||
|
||||
// Stack
|
||||
var stack = d3.layout.stack()
|
||||
.values(function(d) { return d.values; });
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.tsv("assets/demo_data/d3/lines/lines_stacked.tsv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = parseDate(d.date);
|
||||
});
|
||||
|
||||
|
||||
// Set color domains
|
||||
// ------------------------------
|
||||
|
||||
// Filter by date
|
||||
color.domain(d3.keys(data[0]).filter(function(key) { return key !== "date"; }));
|
||||
|
||||
// Set colors
|
||||
var browsers = stack(color.domain().map(function(name) {
|
||||
return {
|
||||
name: name,
|
||||
values: data.map(function(d) {
|
||||
return {date: d.date, y: d[name] / 100};
|
||||
})
|
||||
};
|
||||
}));
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain(d3.extent(data, function(d) { return d.date; }));
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Bind data
|
||||
var browser = svg.selectAll(".browser")
|
||||
.data(browsers)
|
||||
.enter()
|
||||
.append("g")
|
||||
.attr("class", "browser");
|
||||
|
||||
// Add area
|
||||
browser.append("path")
|
||||
.attr("class", "d3-area")
|
||||
.attr("d", function(d) { return area(d.values); })
|
||||
.style("fill", function(d) { return color(d.name); });
|
||||
|
||||
// Add text
|
||||
browser.append("text")
|
||||
.datum(function(d) { return {name: d.name, value: d.values[d.values.length - 1]}; })
|
||||
.attr("transform", function(d) { return "translate(" + x(d.value.date) + "," + y(d.value.y0 + d.value.y / 2) + ")"; })
|
||||
.attr("class", "d3-browsers")
|
||||
.attr("x", -15)
|
||||
.attr("dy", ".35em")
|
||||
.style("fill", "#fff")
|
||||
.style("text-anchor", "end")
|
||||
.text(function(d) { return d.name; });
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-area').attr("d", function(d) { return area(d.values); });
|
||||
|
||||
// Text
|
||||
svg.selectAll('.d3-browsers').attr("transform", function(d) { return "translate(" + x(d.value.date) + "," + y(d.value.y0 + d.value.y / 2) + ")"; });
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,214 @@
|
||||
/* ------------------------------------------------------------------------------
|
||||
*
|
||||
* # D3.js - stacked nested area chart
|
||||
*
|
||||
* Demo d3.js stacked nested area chart setup with .tsv data source
|
||||
*
|
||||
* Version: 1.0
|
||||
* Latest update: August 1, 2015
|
||||
*
|
||||
* ---------------------------------------------------------------------------- */
|
||||
|
||||
$(function () {
|
||||
|
||||
// Initialize chart
|
||||
areaNested('#d3-area-stacked-nest', 400);
|
||||
|
||||
// Chart setup
|
||||
function areaNested(element, height) {
|
||||
|
||||
|
||||
// Basic setup
|
||||
// ------------------------------
|
||||
|
||||
// Define main variables
|
||||
var d3Container = d3.select(element),
|
||||
margin = {top: 5, right: 20, bottom: 20, left: 40},
|
||||
n = 3,
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right,
|
||||
height = height - margin.top - margin.bottom - 5;
|
||||
|
||||
// Format data
|
||||
var format = d3.time.format("%m/%d/%y");
|
||||
|
||||
|
||||
|
||||
// Construct scales
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var x = d3.time.scale()
|
||||
.range([0, width]);
|
||||
|
||||
// Vertical
|
||||
var y = d3.scale.linear()
|
||||
.range([height, 0]);
|
||||
|
||||
// Colors
|
||||
var z = d3.scale.linear()
|
||||
.domain([0, n - 1])
|
||||
.range(["#4DB6AC", "#B2DFDB"]);
|
||||
|
||||
|
||||
|
||||
// Create axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
var xAxis = d3.svg.axis()
|
||||
.scale(x)
|
||||
.orient("bottom")
|
||||
.ticks(d3.time.days);
|
||||
|
||||
// Vertical
|
||||
var yAxis = d3.svg.axis()
|
||||
.scale(y)
|
||||
.orient("left");
|
||||
|
||||
|
||||
|
||||
// Create chart
|
||||
// ------------------------------
|
||||
|
||||
// Add SVG element
|
||||
var container = d3.select(element).append("svg");
|
||||
|
||||
// Add SVG group
|
||||
var svg = container
|
||||
.attr("width", width + margin.left + margin.right)
|
||||
.attr("height", height + margin.top + margin.bottom)
|
||||
.append("g")
|
||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
||||
|
||||
|
||||
|
||||
// Construct chart layout
|
||||
// ------------------------------
|
||||
|
||||
// Stack
|
||||
var stack = d3.layout.stack()
|
||||
.offset("zero")
|
||||
.values(function(d) { return d.values; })
|
||||
.x(function(d) { return d.date; })
|
||||
.y(function(d) { return d.value; });
|
||||
|
||||
// Nest
|
||||
var nest = d3.nest()
|
||||
.key(function(d) { return d.key; });
|
||||
|
||||
// Area
|
||||
var area = d3.svg.area()
|
||||
.interpolate("basis")
|
||||
.x(function(d) { return x(d.date); })
|
||||
.y0(function(d) { return y(d.y0); })
|
||||
.y1(function(d) { return y(d.y0 + d.y); });
|
||||
|
||||
|
||||
|
||||
|
||||
// Load data
|
||||
// ------------------------------
|
||||
|
||||
d3.csv("assets/demo_data/d3/lines/lines_stacked_nest.csv", function(error, data) {
|
||||
|
||||
// Pull out values
|
||||
data.forEach(function(d) {
|
||||
d.date = format.parse(d.date);
|
||||
d.value = +d.value;
|
||||
});
|
||||
|
||||
// Pull out nested entries
|
||||
var layers = stack(nest.entries(data));
|
||||
|
||||
|
||||
// Set input domains
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
x.domain(d3.extent(data, function(d) { return d.date; }));
|
||||
|
||||
// Vertical
|
||||
y.domain([0, d3.max(data, function(d) { return d.y0 + d.y; })]);
|
||||
|
||||
|
||||
//
|
||||
// Append chart elements
|
||||
//
|
||||
|
||||
// Add area
|
||||
svg.selectAll(".d3-area")
|
||||
.data(layers)
|
||||
.enter()
|
||||
.append("path")
|
||||
.attr("class", "d3-area")
|
||||
.attr("d", function(d) { return area(d.values); })
|
||||
.style("stroke", "#fff")
|
||||
.style("stroke-width", 0.5)
|
||||
.style("fill", function(d, i) { return z(i); });
|
||||
|
||||
|
||||
// Append axes
|
||||
// ------------------------------
|
||||
|
||||
// Horizontal
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-horizontal d3-axis-strong")
|
||||
.attr("transform", "translate(0," + height + ")")
|
||||
.call(xAxis);
|
||||
|
||||
// Vertical
|
||||
svg.append("g")
|
||||
.attr("class", "d3-axis d3-axis-vertical d3-axis-strong")
|
||||
.call(yAxis);
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Resize chart
|
||||
// ------------------------------
|
||||
|
||||
// Call function on window resize
|
||||
$(window).on('resize', resize);
|
||||
|
||||
// Call function on sidebar width change
|
||||
$('.sidebar-control').on('click', resize);
|
||||
|
||||
// Resize function
|
||||
//
|
||||
// Since D3 doesn't support SVG resize by default,
|
||||
// we need to manually specify parts of the graph that need to
|
||||
// be updated on window resize
|
||||
function resize() {
|
||||
|
||||
// Layout variables
|
||||
width = d3Container.node().getBoundingClientRect().width - margin.left - margin.right;
|
||||
|
||||
|
||||
// Layout
|
||||
// -------------------------
|
||||
|
||||
// Main svg width
|
||||
container.attr("width", width + margin.left + margin.right);
|
||||
|
||||
// Width of appended group
|
||||
svg.attr("width", width + margin.left + margin.right);
|
||||
|
||||
|
||||
// Axes
|
||||
// -------------------------
|
||||
|
||||
// Horizontal range
|
||||
x.range([0, width]);
|
||||
|
||||
// Horizontal axis
|
||||
svg.selectAll('.d3-axis-horizontal').call(xAxis);
|
||||
|
||||
|
||||
// Chart elements
|
||||
// -------------------------
|
||||
|
||||
// Line path
|
||||
svg.selectAll('.d3-area').attr("d", function(d) { return area(d.values); })
|
||||
}
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user