in correlations.js [566:693]
function graph(svgElem, signature, channel, product) {
loadCorrelationData(signature, channel, product).then((data) => {
d3.select(svgElem).selectAll("*").remove();
if (
!(product in data) ||
!(signature in data[product][channel]["signatures"]) ||
!data[product][channel]["signatures"][signature]["results"]
) {
return;
}
let total_reference = data[product][channel].total;
let total_group = data[product][channel]["signatures"][signature].total;
let correlationData = data[product][channel]["signatures"][signature][
"results"
].filter((elem) => Object.keys(elem.item).length <= 1);
correlationData = sortCorrelationData(
correlationData,
total_reference,
total_group
);
correlationData.reverse();
let margin = { top: 20, right: 300, bottom: 30, left: 300 };
let width = svgElem.getAttribute("width") - margin.left - margin.right;
let height = svgElem.getAttribute("height") - margin.top - margin.bottom;
let y0 = d3.scale.ordinal().rangeRoundBands([height, 0], 0.2, 0.5);
let y1 = d3.scale.ordinal();
let x = d3.scale.linear().range([0, width]);
let color = d3.scale.ordinal().range(["blue", "red"]);
let xAxis = d3.svg.axis().scale(x).tickSize(-height).orient("bottom");
let yAxis = d3.svg.axis().scale(y0).orient("left");
let svg = d3
.select(svgElem)
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
let options = [signature, "Overall"];
correlationData.forEach((d) => {
d.values = [
{ name: "Overall", value: d.count_reference / total_reference },
{ name: signature, value: d.count_group / total_group },
];
});
y0.domain(correlationData.map((d) => itemToLabel(d.item)));
y1.domain(options).rangeRoundBands([0, y0.rangeBand()]);
x.domain([0, 100]);
svg
.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g").attr("class", "y axis").call(yAxis);
let bar = svg
.selectAll(".bar")
.data(correlationData)
.enter()
.append("g")
.attr("class", "rect")
.attr(
"transform",
(d) => "translate( 0," + y0(itemToLabel(d.item)) + ")"
);
let bar_enter = bar
.selectAll("rect")
.data((d) => d.values)
.enter();
bar_enter
.append("rect")
.attr("height", y1.rangeBand())
.attr("y", (d) => y1(d.name))
.attr("x", (d) => 0)
.attr("value", (d) => d.name)
.attr("width", (d) => x((d.value * 100).toFixed(2)))
.style("fill", (d) => color(d.name));
bar_enter
.append("text")
.attr("x", (d) => x((d.value * 100).toFixed(2)) + 5)
.attr("y", (d) => y1(d.name) + y1.rangeBand() / 2)
.attr("dy", ".35em")
.text((d) => (d.value * 100).toFixed(2));
let legend = svg
.selectAll(".legend")
.data(options.slice())
.enter()
.append("g")
.attr("class", "legend")
.attr(
"transform",
(d, i) => "translate(" + margin.right + "," + i * 20 + ")"
);
legend
.append("rect")
.attr("x", width - 18)
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend
.append("text")
.attr("x", width - 24)
.attr("y", 9)
.attr("dy", ".35em")
.style("text-anchor", "end")
.text((d) => d);
});
}