{"id":83,"date":"2026-05-20T17:37:38","date_gmt":"2026-05-20T17:37:38","guid":{"rendered":"https:\/\/flowxiom.com\/?p=83"},"modified":"2026-05-20T17:37:40","modified_gmt":"2026-05-20T17:37:40","slug":"uncertainty-visualization","status":"publish","type":"post","link":"https:\/\/flowxiom.com\/index.php\/2026\/05\/20\/uncertainty-visualization\/","title":{"rendered":"Uncertainty Visualization"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Error Bar and Best Fit Line Slope Simulator<\/title>\n    <style>\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            background-color: #f4f7f6;\n            color: #333;\n            margin: 0;\n            padding: 20px;\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n        }\n\n        h1 {\n            color: #2c3e50;\n        }\n\n        .container {\n            background: white;\n            padding: 20px;\n            border-radius: 10px;\n            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);\n            display: flex;\n            flex-direction: column;\n            max-width: 800px;\n            width: 100%;\n        }\n\n        canvas {\n            border: 1px solid #ddd;\n            background-color: #fafbfc;\n            border-radius: 5px;\n            margin-bottom: 20px;\n            cursor: crosshair;\n        }\n\n        .controls {\n            display: flex;\n            justify-content: space-between;\n            gap: 20px;\n            background: #f8f9fa;\n            padding: 15px;\n            border-radius: 8px;\n            border: 1px solid #eee;\n        }\n\n        .slider-group {\n            flex: 1;\n            display: flex;\n            flex-direction: column;\n        }\n\n        .slider-group label {\n            font-weight: bold;\n            margin-bottom: 8px;\n            color: #495057;\n        }\n\n        input[type=\"range\"] {\n            width: 100%;\n        }\n\n        .results {\n            margin-top: 20px;\n            padding: 15px;\n            background-color: #e9ecef;\n            border-radius: 8px;\n            border-left: 5px solid #0d6efd;\n        }\n\n        .results p {\n            margin: 5px 0;\n            font-size: 16px;\n        }\n\n        .highlight {\n            font-weight: bold;\n            color: #0d6efd;\n            font-size: 1.1em;\n        }\n    <\/style>\n<\/head>\n\n<body>\n\n    <h1>Error Bar and Slope Uncertainty Simulator<\/h1>\n\n    <div class=\"container\">\n        <canvas id=\"graphCanvas\" width=\"760\" height=\"400\"><\/canvas>\n\n        <div class=\"controls\">\n            <div class=\"slider-group\">\n                <label for=\"errX\">Horizontal Error Bar (\u03b4X): <span id=\"valX\">0.20<\/span><\/label>\n                <input type=\"range\" id=\"errX\" min=\"0\" max=\"1\" step=\"0.05\" value=\"0.2\">\n            <\/div>\n            <div class=\"slider-group\">\n                <label for=\"errY\">Vertical Error Bar (\u03b4Y): <span id=\"valY\">0.50<\/span><\/label>\n                <input type=\"range\" id=\"errY\" min=\"0\" max=\"2\" step=\"0.1\" value=\"0.5\">\n            <\/div>\n        <\/div>\n\n        <div class=\"results\">\n            <p>Best Fit Slope (Solid Line): <span id=\"resBest\" class=\"highlight\">0.00<\/span><\/p>\n            <p>Max Possible Slope (Blue Dashed Line): <span id=\"resMax\">0.00<\/span><\/p>\n            <p>Min Possible Slope (Red Dotted Line): <span id=\"resMin\">0.00<\/span><\/p>\n            <p><strong>Final Slope and Uncertainty (m \u00b1 \u03b4m): <span id=\"resFinal\" class=\"highlight\">0.00 \u00b1 0.00<\/span><\/strong><\/p>\n            <p style=\"font-size: 0.9em; color: #666; margin-top: 10px;\">Formula: \u03b4m = (Max Slope &#8211; Min Slope) \/ 2<\/p>\n        <\/div>\n    <\/div>\n\n    <script>\n        const canvas = document.getElementById('graphCanvas');\n        const ctx = canvas.getContext('2d');\n        const errXSlider = document.getElementById('errX');\n        const errYSlider = document.getElementById('errY');\n\n        \/\/ Sample data points (X, Y)\n        let dataPoints = [\n            { x: 1, y: 2.1 }, { x: 2, y: 4.3 }, { x: 3, y: 6.5 }, { x: 4, y: 8.7 }, { x: 5, y: 11.0 }\n        ];\n\n        \/\/ Drawing parameters\n        const padding = 50;\n        const width = canvas.width;\n        const height = canvas.height;\n        let scaleX, scaleY;\n\n        function update() {\n            const errX = parseFloat(errXSlider.value);\n            const errY = parseFloat(errYSlider.value);\n            document.getElementById('valX').innerText = errX.toFixed(2);\n            document.getElementById('valY').innerText = errY.toFixed(2);\n\n            drawGraph(errX, errY);\n        }\n\n        function calculateLinearRegression(data) {\n            let n = data.length, sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;\n            for (let i = 0; i < n; i++) {\n                sumX += data[i].x; sumY += data[i].y; sumXY += data[i].x * data[i].y; sumXX += data[i].x * data[i].x;\n            }\n            let slope = (n * sumXY - sumX * sumY) \/ (n * sumXX - sumX * sumX);\n            let intercept = (sumY - slope * sumX) \/ n;\n            return { slope, intercept };\n        }\n\n        function drawGraph(errX, errY) {\n            ctx.clearRect(0, 0, width, height);\n\n            \/\/ Determine coordinate axis range\n            let minX = 0, maxX = 6;\n            let minY = 0, maxY = 14;\n            scaleX = (width - padding * 2) \/ (maxX - minX);\n            scaleY = (height - padding * 2) \/ (maxY - minY);\n\n            function toCanvas(x, y) {\n                return { cx: padding + (x - minX) * scaleX, cy: height - padding - (y - minY) * scaleY };\n            }\n\n            \/\/ Draw grid and coordinate axes\n            ctx.strokeStyle = '#eee'; ctx.lineWidth = 1;\n            for (let i = minX; i <= maxX; i++) {\n                let p1 = toCanvas(i, minY), p2 = toCanvas(i, maxY);\n                ctx.beginPath(); ctx.moveTo(p1.cx, p1.cy); ctx.lineTo(p2.cx, p2.cy); ctx.stroke();\n            }\n            for (let i = minY; i <= maxY; i += 2) {\n                let p1 = toCanvas(minX, i), p2 = toCanvas(maxX, i);\n                ctx.beginPath(); ctx.moveTo(p1.cx, p1.cy); ctx.lineTo(p2.cx, p2.cy); ctx.stroke();\n            }\n            ctx.strokeStyle = '#333'; ctx.lineWidth = 2;\n            let origin = toCanvas(0, 0); let axisXEnd = toCanvas(maxX, 0); let axisYEnd = toCanvas(0, maxY);\n            ctx.beginPath(); ctx.moveTo(origin.cx, axisYEnd.cy); ctx.lineTo(origin.cx, origin.cy); ctx.lineTo(axisXEnd.cx, origin.cy); ctx.stroke();\n\n            \/\/ Calculate best fit line\n            const bestFit = calculateLinearRegression(dataPoints);\n\n            \/\/ Calculate max\/min slope lines (based on error bounds of first and last data points)\n            const firstPoint = dataPoints[0];\n            const lastPoint = dataPoints[dataPoints.length - 1];\n\n            \/\/ Max slope: passing through bottom-right of first point and top-left of last point\n            let m_max = ((lastPoint.y + errY) - (firstPoint.y - errY)) \/ ((lastPoint.x - errX) - (firstPoint.x + errX));\n            let b_max = (lastPoint.y + errY) - m_max * (lastPoint.x - errX);\n\n            \/\/ Min slope: passing through top-left of first point and bottom-right of last point\n            let m_min = ((lastPoint.y - errY) - (firstPoint.y + errY)) \/ ((lastPoint.x + errX) - (firstPoint.x - errX));\n            let b_min = (lastPoint.y - errY) - m_min * (lastPoint.x + errX);\n\n            \/\/ Line drawing function\n            function drawLine(slope, intercept, color, dash) {\n                ctx.beginPath();\n                ctx.strokeStyle = color;\n                ctx.setLineDash(dash);\n                let p1 = toCanvas(minX, slope * minX + intercept);\n                let p2 = toCanvas(maxX, slope * maxX + intercept);\n                ctx.moveTo(p1.cx, p1.cy); ctx.lineTo(p2.cx, p2.cy);\n                ctx.stroke();\n                ctx.setLineDash([]); \/\/ reset\n            }\n\n            \/\/ Draw three lines\n            ctx.lineWidth = 2;\n            drawLine(m_max, b_max, 'rgba(13, 110, 253, 0.6)', [5, 5]); \/\/ Blue dashed line (Max)\n            drawLine(m_min, b_min, 'rgba(220, 53, 69, 0.6)', [2, 4]); \/\/ Red dotted line (Min)\n            ctx.lineWidth = 3;\n            drawLine(bestFit.slope, bestFit.intercept, '#212529', []); \/\/ Black solid line (Best Fit)\n\n            \/\/ Draw data points and error bars\n            ctx.fillStyle = '#000';\n            ctx.strokeStyle = '#000';\n            ctx.lineWidth = 1.5;\n            dataPoints.forEach(p => {\n                let center = toCanvas(p.x, p.y);\n\n                \/\/ Draw point\n                ctx.beginPath(); ctx.arc(center.cx, center.cy, 4, 0, Math.PI * 2); ctx.fill();\n\n                \/\/ Draw vertical error bars\n                let yTop = toCanvas(p.x, p.y + errY).cy;\n                let yBottom = toCanvas(p.x, p.y - errY).cy;\n                ctx.beginPath(); ctx.moveTo(center.cx, yTop); ctx.lineTo(center.cx, yBottom); ctx.stroke();\n                ctx.beginPath(); ctx.moveTo(center.cx - 5, yTop); ctx.lineTo(center.cx + 5, yTop); ctx.stroke();\n                ctx.beginPath(); ctx.moveTo(center.cx - 5, yBottom); ctx.lineTo(center.cx + 5, yBottom); ctx.stroke();\n\n                \/\/ Draw horizontal error bars\n                let xLeft = toCanvas(p.x - errX, p.y).cx;\n                let xRight = toCanvas(p.x + errX, p.y).cx;\n                ctx.beginPath(); ctx.moveTo(xLeft, center.cy); ctx.lineTo(xRight, center.cy); ctx.stroke();\n                ctx.beginPath(); ctx.moveTo(xLeft, center.cy - 5); ctx.lineTo(xLeft, center.cy + 5); ctx.stroke();\n                ctx.beginPath(); ctx.moveTo(xRight, center.cy - 5); ctx.lineTo(xRight, center.cy + 5); ctx.stroke();\n            });\n\n            \/\/ Update panel data\n            let uncertainty = (m_max - m_min) \/ 2;\n            document.getElementById('resBest').innerText = bestFit.slope.toFixed(3);\n            document.getElementById('resMax').innerText = m_max.toFixed(3);\n            document.getElementById('resMin').innerText = m_min.toFixed(3);\n            document.getElementById('resFinal').innerText = `${bestFit.slope.toFixed(3)} \u00b1 ${uncertainty.toFixed(3)}`;\n        }\n\n        \/\/ Listen to slider events\n        errXSlider.addEventListener('input', update);\n        errYSlider.addEventListener('input', update);\n\n        \/\/ Initial rendering\n        update();\n    <\/script>\n<\/body>\n\n<\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Real-time interactive modeling of statistical error margins and probability density fields.<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-83","post","type-post","status-publish","format-standard","hentry","category-visual-learning-tools"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/posts\/83","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/comments?post=83"}],"version-history":[{"count":1,"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/posts\/83\/revisions"}],"predecessor-version":[{"id":84,"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/posts\/83\/revisions\/84"}],"wp:attachment":[{"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/media?parent=83"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/categories?post=83"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flowxiom.com\/index.php\/wp-json\/wp\/v2\/tags?post=83"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}