A recreation of a Protovis example in D3 using the stack layout.
forked from mbostock's block: Stacked Bar Chart
forked from gawain91's block: Stacked Bar Chart
forked from mikemaieli's block: Horizontal Stacked Bar Chart v1
xxxxxxxxxx
<meta charset="utf-8">
<style>
.axis text {
font: 12px sans-serif;
}
.axis line,
.axis path {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.axis--x path {
display: none;
}
</style>
<body>
Viz 1 rough rough draft for our IDS-455 project. This will be added to the Electron application.<br><br><br>
<div id="option">Select Chart:
<input name="updateButton"
type="button"
value="Overall"
onclick="updateDataOverall()" />
<input name="updateButton"
type="button"
value="Sex"
onclick="updateDataSex()" />
<input name="updateButton"
type="button"
value="Country"
onclick="updateDataCountry()" />
<input name="updateButton"
type="button"
value="Race"
onclick="updateDataRace()" />
<input name="updateButton"
type="button"
value="Age"
onclick="updateDataAge()" />
<input name="updateButton"
type="button"
value="Degree"
onclick="updateDataDegree()" />
</div>
<script src="//d3js.org/d3.v3.min.js"></script>
<script>
var factors = ["Attended","WantedToAttend", "DidNotAttend"];
//build canvas
var margin = {top: 20, right: 50, bottom: 30, left: 120},
width = 660 - margin.left - margin.right,
height = 300 - margin.top - margin.bottom;
//define x-axis
var x = d3.scale.linear()
.range([0, width]);
//define y-axis
var y = d3.scale.ordinal()
.rangeRoundBands([height, 0], .1);
//define color scale
var z = d3.scale.category20c();
//create x-axis
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom")
//create y-axis
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
//define svg element
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
//read data and transform it
d3.csv("dataoverall.csv", type, function(error, data) {
if (error) throw error;
console.log(data)
var layers = d3.layout.stack()(factors.map(function(c) {
return data.map(function(d) {
return {x: d.Variable, y: d[c]};
});
}));
//scale axes
y.domain(layers[0].map(function(d) { return d.x; }));
// x.domain([0, d3.max(layers[layers.length - 1], function(d) { return d.y0 + d.y; })]).nice();
x.domain([0, 100]).nice();
//building bars
var layer = svg.selectAll(".layers")
.data(layers)
.enter().append("g")
.attr("class", "layer")
.style("fill", function(d, i) { return z(i); });
layer.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
.attr("y", function(d) { return y(d.x); })
.attr("x", function(d) {return x(d.y0); })
.attr("width", function(d) {return x(d.y); })
.attr("height", y.rangeBand());
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "axis axis--y")
.attr("transform", "translate(" + 0 + ",0)")
.call(yAxis);
});
function type(d) {
factors.forEach(function(c) { d[c] = +d[c]; });
return d;
};
function updateDataOverall() {
//remove existing selection
svg.selectAll("*").remove();
//bring in new data
d3.csv("dataoverall.csv", type, function(error, data) {
if (error) throw error;
console.log(data)
var layers = d3.layout.stack()(factors.map(function(c) {
return data.map(function(d) {
return {x: d.Variable, y: d[c]};
});
}));
//scale axes
y.domain(layers[0].map(function(d) { return d.x; }));
// x.domain([0, d3.max(layers[layers.length - 1], function(d) { return d.y0 + d.y; })]).nice();
x.domain([0, 100]).nice();
//building bars
var layer = svg.selectAll(".layers")
.data(layers)
.enter().append("g")
.attr("class", "layer")
.style("fill", function(d, i) { return z(i); });
layer.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
.attr("y", function(d) { return y(d.x); })
.attr("x", function(d) {return x(d.y0); })
.attr("width", function(d) {return x(d.y); })
.attr("height", y.rangeBand());
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "axis axis--y")
.attr("transform", "translate(" + 0 + ",0)")
.call(yAxis);
});
function type(d) {
factors.forEach(function(c) { d[c] = +d[c]; });
return d;
};
}
function updateDataSex() {
//remove existing selection
svg.selectAll("*").remove();
//bring in new data
d3.csv("datasex.csv", type, function(error, data) {
if (error) throw error;
console.log(data)
var layers = d3.layout.stack()(factors.map(function(c) {
return data.map(function(d) {
return {x: d.Variable, y: d[c]};
});
}));
//scale axes
y.domain(layers[0].map(function(d) { return d.x; }));
// x.domain([0, d3.max(layers[layers.length - 1], function(d) { return d.y0 + d.y; })]).nice();
x.domain([0, 100]).nice();
//building bars
var layer = svg.selectAll(".layers")
.data(layers)
.enter().append("g")
.attr("class", "layer")
.style("fill", function(d, i) { return z(i); });
layer.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
.attr("y", function(d) { return y(d.x); })
.attr("x", function(d) {return x(d.y0); })
.attr("width", function(d) {return x(d.y); })
.attr("height", y.rangeBand());
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "axis axis--y")
.attr("transform", "translate(" + 0 + ",0)")
.call(yAxis);
});
function type(d) {
factors.forEach(function(c) { d[c] = +d[c]; });
return d;
};
}
function updateDataCountry() {
//remove existing selection
svg.selectAll("*").remove();
//bring in new data
d3.csv("databirthcountry.csv", type, function(error, data) {
if (error) throw error;
console.log(data)
var layers = d3.layout.stack()(factors.map(function(c) {
return data.map(function(d) {
return {x: d.Variable, y: d[c]};
});
}));
//scale axes
y.domain(layers[0].map(function(d) { return d.x; }));
// x.domain([0, d3.max(layers[layers.length - 1], function(d) { return d.y0 + d.y; })]).nice();
x.domain([0, 100]).nice();
//building bars
var layer = svg.selectAll(".layers")
.data(layers)
.enter().append("g")
.attr("class", "layer")
.style("fill", function(d, i) { return z(i); });
layer.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
.attr("y", function(d) { return y(d.x); })
.attr("x", function(d) {return x(d.y0); })
.attr("width", function(d) {return x(d.y); })
.attr("height", y.rangeBand());
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "axis axis--y")
.attr("transform", "translate(" + 0 + ",0)")
.call(yAxis);
});
function type(d) {
factors.forEach(function(c) { d[c] = +d[c]; });
return d;
};
}
function updateDataRace() {
//remove existing selection
svg.selectAll("*").remove();
//bring in new data
d3.csv("datarace.csv", type, function(error, data) {
if (error) throw error;
console.log(data)
var layers = d3.layout.stack()(factors.map(function(c) {
return data.map(function(d) {
return {x: d.Variable, y: d[c]};
});
}));
//scale axes
y.domain(layers[0].map(function(d) { return d.x; }));
// x.domain([0, d3.max(layers[layers.length - 1], function(d) { return d.y0 + d.y; })]).nice();
x.domain([0, 100]).nice();
//building bars
var layer = svg.selectAll(".layers")
.data(layers)
.enter().append("g")
.attr("class", "layer")
.style("fill", function(d, i) { return z(i); });
layer.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
.attr("y", function(d) { return y(d.x); })
.attr("x", function(d) {return x(d.y0); })
.attr("width", function(d) {return x(d.y); })
.attr("height", y.rangeBand());
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "axis axis--y")
.attr("transform", "translate(" + 0 + ",0)")
.call(yAxis);
});
function type(d) {
factors.forEach(function(c) { d[c] = +d[c]; });
return d;
};
}
function updateDataAge() {
//remove existing selection
svg.selectAll("*").remove();
//bring in new data
d3.csv("dataage.csv", type, function(error, data) {
if (error) throw error;
console.log(data)
var layers = d3.layout.stack()(factors.map(function(c) {
return data.map(function(d) {
return {x: d.Variable, y: d[c]};
});
}));
//scale axes
y.domain(layers[0].map(function(d) { return d.x; }));
// x.domain([0, d3.max(layers[layers.length - 1], function(d) { return d.y0 + d.y; })]).nice();
x.domain([0, 100]).nice();
//building bars
var layer = svg.selectAll(".layers")
.data(layers)
.enter().append("g")
.attr("class", "layer")
.style("fill", function(d, i) { return z(i); });
layer.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
.attr("y", function(d) { return y(d.x); })
.attr("x", function(d) {return x(d.y0); })
.attr("width", function(d) {return x(d.y); })
.attr("height", y.rangeBand());
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "axis axis--y")
.attr("transform", "translate(" + 0 + ",0)")
.call(yAxis);
});
function type(d) {
factors.forEach(function(c) { d[c] = +d[c]; });
return d;
};
}
function updateDataDegree() {
//remove existing selection
svg.selectAll("*").remove();
//bring in new data
d3.csv("dataeducation.csv", type, function(error, data) {
if (error) throw error;
console.log(data)
var layers = d3.layout.stack()(factors.map(function(c) {
return data.map(function(d) {
return {x: d.Variable, y: d[c]};
});
}));
//scale axes
y.domain(layers[0].map(function(d) { return d.x; }));
// x.domain([0, d3.max(layers[layers.length - 1], function(d) { return d.y0 + d.y; })]).nice();
x.domain([0, 100]).nice();
//building bars
var layer = svg.selectAll(".layers")
.data(layers)
.enter().append("g")
.attr("class", "layer")
.style("fill", function(d, i) { return z(i); });
layer.selectAll("rect")
.data(function(d) { return d; })
.enter().append("rect")
.attr("y", function(d) { return y(d.x); })
.attr("x", function(d) {return x(d.y0); })
.attr("width", function(d) {return x(d.y); })
.attr("height", y.rangeBand());
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g")
.attr("class", "axis axis--y")
.attr("transform", "translate(" + 0 + ",0)")
.call(yAxis);
});
function type(d) {
factors.forEach(function(c) { d[c] = +d[c]; });
return d;
};
}
</script>
https://d3js.org/d3.v3.min.js