roundBarGauge1 = function(data, title) {
const dim = {},
defaults = {
container: {
width: width,
margin: 40,
draw: true,
rounding: 20
},
bar: {
height: 40,
spacing: 10,
rounding: 20,
centered: false,
percent: false
},
color: {
container: "#01286b",
title: "#fff",
bar_value: "#e61",
bar_total: "#ccc",
bar_value_text : "#fff",
bar_total_text: "#fff"
},
label : {
title: false,
category: true,
value: true,
total: true
}
};
defaults.label.title = title ? true : false;
var setDim = (function initDim () {
dim.outerWidth = defaults.container.width;
dim.innerWidth = defaults.container.width - 2 * defaults.container.margin;
dim.height = (data.length * (defaults.bar.height + defaults.bar.spacing))
+ (2 * defaults.container.margin);
return initDim;
})();
var BarGauge = {};
BarGauge.setProperties = function(section, params) {
Object.keys(params).map(function(d) {
if (d in defaults[section])
defaults[section][d] = params[d];
else
throw new Error('One or more parameters not accepted.');
}); setDim();
}
BarGauge.debug = function () {
return {dim, defaults};
}
BarGauge.draw = function () {
var barScale = d3.scaleLinear()
.range([defaults.container.margin, dim.innerWidth]);
const svg = d3.create("svg"),
background = svg.append("g"),
title_text = svg.append("g"),
bar_container = svg.append("g"),
bars = bar_container
.selectAll("g")
.attr("class", "bar")
.data(data)
.enter();
svg
.attr("viewBox", [0, 0, dim.outerWidth, dim.height])
.attr("width", dim.outerWidth)
.attr("height", dim.height);
background
.append("rect")
.attr("visibility", defaults.container.draw ? "visible" : "hidden")
.attr("height", dim.height)
.attr("width", dim.outerWidth)
.attr("rx", defaults.container.rounding)
.attr("fill", defaults.color.container);
if (defaults.label.title)
title_text
.append("text")
.attr("x", barScale(0))
.attr("y", 0.75 * defaults.container.margin)
.attr("dy", "0.35em")
.attr("font-size", "1.15em")
.attr("fill", defaults.color.title)
.text(title);
bar_container
.attr("class", "bar-container")
.attr("transform",
`translate(0, ${
defaults.label.title === true ?
1.5 * defaults.container.margin : defaults.container.margin + defaults.bar.spacing
})`);
bars
.append("rect")
.attr("class", "bar-total")
.attr("x", barScale(0))
.attr("y", (_, i) => i * (defaults.bar.height + defaults.bar.spacing))
.attr("height", defaults.bar.height)
.attr("width", dim.innerWidth)
.attr("rx", defaults.bar.rounding)
.attr("fill", defaults.color.bar_total);
if (defaults.label.total)
bars
.append("text")
.attr("class", "bar-text bar-total")
.attr("x", barScale(0) + dim.innerWidth - 0.25 * defaults.bar.height)
.attr("y", (_, i) => i * (defaults.bar.height + defaults.bar.spacing) + 0.5 * defaults.bar.height)
.attr("font-size", "0.75em")
.attr("text-anchor", "end")
.attr("dx", "-0.5em")
.attr("dy", "0.35em")
.attr("fill", defaults.color.bar_total_text)
.text(d => d.total);
bars
.append("rect")
.attr("class", "bar-value")
.attr("x", function (d) {
if (defaults.bar.centered === false) return barScale(0);
var s = barScale.domain([0, d.total]);
return barScale(0) + s(0.5 * d.total) - s(0.5 * d.value);
})
.attr("y", (_, i) => i * (defaults.bar.height + defaults.bar.spacing))
.attr("height", defaults.bar.height)
.attr("width", d => barScale.domain([0, d.total])(d.value))
.attr("rx", defaults.bar.rounding)
.attr("fill", defaults.color.bar_value);
if (defaults.label.category)
bars
.append("text")
.attr("class", "bar-text bar-label")
.attr("x", function (d) {
var s = barScale.domain([0, d.total]),
pad = 0.25 * defaults.bar.height;
if (defaults.bar.centered === false) return barScale(0) + pad;
return barScale(0) + s(0.5 * d.total) - s(0.5 * d.value) + pad;
})
.attr("y", (_, i) => i * (defaults.bar.height + defaults.bar.spacing) + 0.5 * defaults.bar.height)
.attr("font-size", "0.75em")
.attr("text-anchor", "start")
.attr("dy", "0.35em")
.attr("fill", defaults.color.bar_value_text)
.text(d => d.category);
if (defaults.label.value)
bars
.append("text")
.attr("class", "bar-text bar-value")
.attr("x", d => barScale(0) + barScale.domain([0, d.total])(d.value) - 0.25 * defaults.bar.height)
.attr("x", function (d) {
var s = barScale.domain([0, d.total]),
pad = 0.25 * defaults.bar.height;
if (defaults.bar.centered === false) return barScale(0) + s(d.value) - pad;
return s(0.5 * d.total) + s(0.5 * d.value) - pad;
})
.attr("y", (_, i) => i * (defaults.bar.height + defaults.bar.spacing) + 0.5 * defaults.bar.height)
.attr("font-size", "0.75em")
.attr("text-anchor", "end")
.attr("dy", "0.35em")
.attr("fill", defaults.color.bar_value_text)
.text(d => defaults.bar.percent === true ? Math.round(100 * (d.value / d.total)) + '%' : d.value);
return svg.node();
}
return BarGauge;
}