paracoords = {
const svg = d3.create("svg").attr("viewBox", [0, 0, width, height]);
svg
.append("style")
.text("path.hidden { stroke: #000; stroke-opacity: 0.01;}");
let activeBrushes = new Map();
const polylines = svg
.append("g")
.attr("fill", "none")
.attr("stroke-width", 1.5)
.attr("stroke-opacity", 0.4)
.selectAll("path")
.data(data)
.join("path");
function path(d){
console.log("cross: "+ (d3.cross(attributes, [d], (key, d) => [key, d[key]])));
return d3.line()
.defined(([, value]) => value != null)
(attributes.map(function(p) { return [x(p), y.get(p)(d[p])]; }))
}
polylines.attr("stroke", d => colorScale.get(colorAttribute)(d[colorAttribute]))
.attr("stroke-opacity", 0.8)
.attr("d", path);
const axes = svg
.append("g")
.selectAll("g")
.data(attributes)
.join("g")
.attr("transform", d => `translate(${x(d)},0)`);
axes.each(function(d) {
console.log("axes argument: " + d);
console.log("axes argument: " + this);
var y_axis = d3.axisRight(y.get(d));
d3.select(this)
.call(y_axis.ticks());
})
.call(g => g.append("text")
.attr("y", 7)
.attr("x", -10)
.attr("text-anchor", "start")
.attr("fill", "currentColor")
.text(d => shortAttributeNames.get(d)))
.call(g => g.selectAll("text")
.clone(true).lower()
.attr("fill", "none")
.attr("stroke-width", 5)
.attr("stroke-linejoin", "round")
.attr("stroke", "white"));
console.log(polylines);
function updateBrushing() {
polylines.classed("hidden", d => {
let isHidden = attributes.filter(f => activeBrushes.has(f)).some ( attribute =>
activeBrushes.get(attribute)[0] > y.get(attribute)(d[attribute])
||
activeBrushes.get(attribute)[1] < y.get(attribute)(d[attribute])
);
console.log(isHidden);
return isHidden;
});
}
function brushed(attribute) {
activeBrushes.set(attribute, d3.event.selection);
updateBrushing();
}
function brushEnd(attribute) {
if (d3.event.selection !== null) return;
activeBrushes.delete(attribute);
updateBrushing();
}
const brushes = axes.append("g").call(
d3
.brushY()
.extent([[-10, margin.top], [10, height - margin.bottom]])
.on("brush", brushed)
.on("end", brushEnd)
);
return svg.node();
}