function createLinePlot1(
featureMaps,
featureMapKey,
originalData,
height = 300
) {
const { plotData, histogramData } = preprocess1DData2(
featureMaps,
featureMapKey,
originalData
);
const featureName = featureMaps["1D"][featureMapKey].feature;
const xValues = data.map((d) => d.x);
const minXValue = Math.min(...xValues);
const maxXValue = Math.max(...xValues);
console.log("asdasd", minXValue, maxXValue);
const linePlot = vl
.markLine()
.data(plotData)
.encode(
vl.x().fieldQ("x").title(featureName),
vl.y().fieldQ("y"),
vl.tooltip().fieldN("class")
);
console.log(histogramData);
const numBins = 20;
const binSize = (maxXValue - minXValue) / numBins;
console.log("binSize", binSize);
const binEdges = Array.from(
{ length: numBins + 1 },
(_, i) => minXValue + i * binSize
);
console.log("binEdges", binEdges);
const bins0 = binEdges.slice(0, -1).map((binStart, i) => ({
binStart,
binEnd: binEdges[i + 1],
count: 0
}));
const bins1 = binEdges.slice(0, -1).map((binStart, i) => ({
binStart,
binEnd: binEdges[i + 1],
count: 0
}));
originalData.forEach((d) => {
const binIndex = Math.floor((d.x - minXValue) / binSize);
if (binIndex >= 0 && binIndex < numBins) {
if (d.target === 0) {
bins0[binIndex].count += 1;
} else {
bins1[binIndex].count += 1;
}
}
});
const combinedBins = [...bins0, ...bins1].map((bin, i) => ({
...bin,
class: i < numBins ? "Class_0" : "Class_1"
}));
console.log("histogramData", histogramData);
const histogram = vl
.markBar()
.data(combinedBins)
.encode(
vl.y().value(0),
vl.y2().value(height),
vl
.x()
.fieldQ("binStart")
.scale({ domain: [minXValue, maxXValue] }),
vl.x2().fieldQ("binEnd"),
vl
.opacity()
.fieldQ("count")
.scale({ domain: [0, 1], range: [0, 0.02] }),
vl.color().fieldN("class")
);
const zeroLine = vl
.markRule({ strokeDash: [5, 5] })
.data([{ y: 0 }])
.encode(vl.y().fieldQ("y"));
return vl.layer(histogram, linePlot, zeroLine).height(height).render();
}