chart = {
const chart = new G2.Chart({ width, paddingLeft: 120 });
const xy = (node) =>
node
.encode("x", "speaker")
.encode("y", "proportion")
.transform({
type: "stackY",
orderBy: (d) => Math.abs(politifact.rulings.indexOf(d.ruling) - 3)
})
.scale("x", {
guide: null,
domain: d3.groupSort(
politifact,
(D) => d3.sum(D, (d) => Math.min(0, d.proportion)),
(d) => d.speaker
)
});
chart.coordinate({ type: "transpose" }).data(politifact);
chart
.interval()
.scale("color", {
range: d3.schemeSpectral[politifact.rulings.length],
domain: politifact.rulings
})
.scale("y", {
guide: { formatter: d3.format("~%"), position: "top" },
tickCount: 15
})
.call(xy)
.encode("color", "ruling");
chart.annotationLineY().data([0]).encode("y", 0).style("stroke", "black");
chart
.text()
.encode("text", "speaker")
.call(xy)
.transform({ type: "selectY", selector: "min" })
.encode("series", "speaker")
.style("fill", "black")
.style("textAnchor", "end")
.style("dx", -5)
.style("dy", 5);
chart
.text()
.data([0])
.encode("text", "← more lies · Truthiness · more truths →")
.scale("x", { independent: true, type: "identity" })
.encode("x", 0)
.encode("y", 0)
.style("textAnchor", "center")
.style("fill", "black")
.style("dy", -30);
return node(chart.render());
}