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: #444444;
opacity: ;
shape-rendering: crispEdges;
}
.axis--x path {
display: none;
}
</style>
<body>
<div><p style=
"font-family:sans-serif;
font-size:18px"><b>Who Attends</b><i> (or does not attend)</i> <b>Arts Programming?</b><br><font size="2">Level of arts attendance by segments of respondents</font></div>
<div id="option"><p style=
"margin-left: 30px;
font-family:sans-serif;
font-size:12px"> Select Category:
<input name="updateButton"
type="button"
value="Overall"
onclick="updateDataOverall()" />
<input name="updateButton"
type="button"
value="Sex"
onclick="updateDataSex()" />
<input name="updateButton"
type="button"
value="Birth 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="Highest Education"
onclick="updateDataDegree()" /> </p>
</div>
<p style=
"margin-left: 120px;
font-family:sans-serif;
font-size:12px">
<font color="#b1577d">Arts Attendees</font> | <font color="#5f163a"><b>Interested Non-Attendees</b></font> | <font color="#969696">Other Non-Attendees</font>
</p>
<script src="//d3js.org/d3.v3.min.js"></script>
<script>
var factors = ["Attended","WantedToAttend", "DidNotAttend"];
//build canvas
var margin = {top: 0, 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.ordinal()
.range(["#b1577d", "#5f163a" , "#969696"]);
//create x-axis
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom")
.tickValues([0,25,50,75,100])
.tickSize(-height)
.tickFormat(function(d){return d+ "%"});
//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
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
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());
layer.selectAll("text")
.data(function(d) { return d; })
.enter().append("text")
.attr("y", function(d) {return y(d.x)+115; })
.attr("x", function(d) {return x(d.y0)+25; })
.attr("text-anchor","middle")
.style("font-size", "14px")
.style("fill", "#fff")
.style("font-family", "Sans-serif")
.text(function(d) { return d3.select(d.y)+ "%"})
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
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
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());
layer.selectAll("text")
.data(function(d) { return d; })
.enter().append("text")
.attr("y", function(d) {return y(d.x)+115; })
.attr("x", function(d) {return x(d.y0)+25; })
.attr("text-anchor","middle")
.style("font-size", "14px")
.style("fill", "#fff")
.style("font-family", "Sans-serif")
.text(function(d) { return d3.select(d.y)+ "%"})
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
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
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());
layer.selectAll("text")
.data(function(d) { return d; })
.enter().append("text")
.attr("y", function(d) {return y(d.x)+62; })
.attr("x", function(d) {return x(d.y0)+25; })
.attr("text-anchor","middle")
.style("font-size", "14px")
.style("fill", "#fff")
.style("font-family", "Sans-serif")
.text(function(d) { return d3.select(d.y)+ "%"})
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
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
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());
layer.selectAll("text")
.data(function(d) { return d; })
.enter().append("text")
.attr("y", function(d) {return y(d.x)+62; })
.attr("x", function(d) {return x(d.y0)+25; })
.attr("text-anchor","middle")
.style("font-size", "14px")
.style("fill", "#fff")
.style("font-family", "Sans-serif")
.text(function(d) { return d3.select(d.y)+ "%"})
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
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
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());
layer.selectAll("text")
.data(function(d) { return d; })
.enter().append("text")
.attr("y", function(d) {return y(d.x)+45; })
.attr("x", function(d) {return x(d.y0)+25; })
.attr("text-anchor","middle")
.style("font-size", "14px")
.style("fill", "#fff")
.style("font-family", "Sans-serif")
.text(function(d) { return d3.select(d.y)+ "%"})
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
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
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());
layer.selectAll("text")
.data(function(d) { return d; })
.enter().append("text")
.attr("y", function(d) {return y(d.x)+34; })
.attr("x", function(d) {return x(d.y0)+25; })
.attr("text-anchor","middle")
.style("font-size", "14px")
.style("fill", "#fff")
.style("font-family", "Sans-serif")
.text(function(d) { return d3.select(d.y)+ "%"})
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
svg.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
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());
layer.selectAll("text")
.data(function(d) { return d; })
.enter().append("text")
.attr("y", function(d) {return y(d.x)+27; })
.attr("x", function(d) {return x(d.y0)+25; })
.attr("text-anchor","middle")
.style("font-size", "14px")
.style("fill", "#fff")
.style("font-family", "Sans-serif")
.text(function(d) { return d3.select(d.y)+ "%"})
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