Add visualization_tool/js/charts.js
This commit is contained in:
parent
b6226f3dac
commit
97f1ff99df
1 changed files with 77 additions and 0 deletions
77
visualization_tool/js/charts.js
Normal file
77
visualization_tool/js/charts.js
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
/**
|
||||||
|
* @module charts
|
||||||
|
* @description Verarbeitet Analyseergebnisse zu grafischen Darstellungen der Δt‑Verteilung.
|
||||||
|
* Enthält Funktionen zur Darstellung der Resultate in einem Canvas im Element #chart-panel.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rendert ein einfaches Balkendiagramm der Δt‑Werte innerhalb #chart-panel.
|
||||||
|
* @param {Array<{run_id: string, category: string, delta_t: number, timestamp: string, status: string}>} results - Analyseergebnisse
|
||||||
|
*/
|
||||||
|
export function renderChart(results) {
|
||||||
|
const panel = document.getElementById('chart-panel');
|
||||||
|
if (!panel) return;
|
||||||
|
|
||||||
|
// Vorherige Inhalte leeren
|
||||||
|
panel.innerHTML = '';
|
||||||
|
|
||||||
|
// Canvas erzeugen
|
||||||
|
const canvas = document.createElement('canvas');
|
||||||
|
canvas.setAttribute('aria-label', 'Δt‑Verteilung Diagramm');
|
||||||
|
canvas.setAttribute('role', 'img');
|
||||||
|
panel.appendChild(canvas);
|
||||||
|
|
||||||
|
const ctx = canvas.getContext('2d');
|
||||||
|
|
||||||
|
// Daten vorbereiten: Zonen definieren und zählen
|
||||||
|
const bins = [
|
||||||
|
{ label: '< -2', min: -Infinity, max: -2 },
|
||||||
|
{ label: '-2 bis -1', min: -2, max: -1 },
|
||||||
|
{ label: '-1 bis 0', min: -1, max: 0 },
|
||||||
|
{ label: '0 bis 1', min: 0, max: 1 },
|
||||||
|
{ label: '> 1', min: 1, max: Infinity }
|
||||||
|
];
|
||||||
|
|
||||||
|
const binCounts = bins.map(({ min, max }) =>
|
||||||
|
results.filter(r => r.delta_t >= min && r.delta_t < max).length
|
||||||
|
);
|
||||||
|
|
||||||
|
const maxCount = Math.max(...binCounts, 1);
|
||||||
|
|
||||||
|
const width = canvas.width = panel.clientWidth || 400;
|
||||||
|
const height = canvas.height = 300;
|
||||||
|
const barWidth = width / bins.length - 10;
|
||||||
|
|
||||||
|
ctx.clearRect(0, 0, width, height);
|
||||||
|
ctx.font = '14px sans-serif';
|
||||||
|
ctx.textAlign = 'center';
|
||||||
|
ctx.textBaseline = 'top';
|
||||||
|
|
||||||
|
bins.forEach((bin, i) => {
|
||||||
|
const x = i * (barWidth + 10) + 10;
|
||||||
|
const y = height - (binCounts[i] / maxCount) * (height - 50);
|
||||||
|
const barHeight = (binCounts[i] / maxCount) * (height - 50);
|
||||||
|
|
||||||
|
// Farbkennzeichnung: Δt < 0 Fälle hervorheben
|
||||||
|
const isCritical = bin.max <= 0;
|
||||||
|
ctx.fillStyle = isCritical ? 'hsl(0, 70%, 50%)' : 'hsl(210, 50%, 50%)';
|
||||||
|
|
||||||
|
ctx.fillRect(x, y, barWidth, barHeight);
|
||||||
|
ctx.fillStyle = '#000';
|
||||||
|
ctx.fillText(bin.label, x + barWidth / 2, height - 20);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Achsen zeichnen
|
||||||
|
ctx.strokeStyle = '#333';
|
||||||
|
ctx.lineWidth = 1;
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(0, height - 30);
|
||||||
|
ctx.lineTo(width, height - 30);
|
||||||
|
ctx.stroke();
|
||||||
|
|
||||||
|
// Optional: Legende zeichnen
|
||||||
|
ctx.fillStyle = '#000';
|
||||||
|
ctx.textAlign = 'left';
|
||||||
|
ctx.fillText('Δt < 0 (kritisch): Rot', 10, 10);
|
||||||
|
ctx.fillText('Δt ≥ 0: Blau', 10, 30);
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue