Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Datenkonvertierung
›
Startseite
manifest.json
0; }); var pts = []; for (var i = 0; i < lines.length; i++) { var parts = lines[i].split(/[\s,;\t]+/).filter(function(x) { return x.length > 0; }); if (parts.length >= 2) { pts.push({ x: parseFloat(parts[0]), y: parseFloat(parts[1]) }); } } return pts; } function escape(s) { return String(s).replace(/[&<>"']/g, function(c) { return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } function linReg(pts) { var n = pts.length; if (n < 2) return null; var sx = 0, sy = 0, sxx = 0, sxy = 0; for (var i = 0; i < n; i++) { sx += pts[i].x; sy += pts[i].y; sxx += pts[i].x * pts[i].x; sxy += pts[i].x * pts[i].y; } var denom = n * sxx - sx * sx; if (denom === 0) return null; var b = (n * sxy - sx * sy) / denom; var a = (sy - b * sx) / n; // R² var yMean = sy / n; var ssTot = 0, ssRes = 0; for (var j = 0; j < n; j++) { var yp = a + b * pts[j].x; ssTot += (pts[j].y - yMean) * (pts[j].y - yMean); ssRes += (pts[j].y - yp) * (pts[j].y - yp); } var r2 = ssTot === 0 ? 1 : 1 - ssRes / ssTot; return { a: a, b: b, r2: r2 }; } function renderScatterPlot(pts, showReg, title, xlabel, ylabel) { if (pts.length === 0) return ''; var W = 720, H = 420; var M = { top: 50, right: 40, bottom: 60, left: 70 }; var innerW = W - M.left - M.right; var innerH = H - M.top - M.bottom; var xs = pts.map(function(p) { return p.x; }); var ys = pts.map(function(p) { return p.y; }); var xMin = Math.min.apply(null, xs), xMax = Math.max.apply(null, xs); var yMin = Math.min.apply(null, ys), yMax = Math.max.apply(null, ys); if (xMin === xMax) { xMin -= 1; xMax += 1; } if (yMin === yMax) { yMin -= 1; yMax += 1; } function sx(x) { return M.left + (x - xMin) / (xMax - xMin) * innerW; } function sy(y) { return M.top + innerH - (y - yMin) / (yMax - yMin) * innerH; } var svg = '
'; if (title) svg += '
' + escape(title) + '
'; svg += '
'; svg += '
'; for (var i = 0; i <= 5; i++) { var vy = yMin + (yMax - yMin) * (5 - i) / 5; var y = M.top + innerH * i / 5; svg += '
'; svg += '
' + vy.toFixed(1) + '
'; var vx = xMin + (xMax - xMin) * i / 5; var xx = M.left + innerW * i / 5; svg += '
' + vx.toFixed(1) + '
'; } // 散点 for (var k = 0; k < pts.length; k++) { svg += '
'; } // 回归线 if (showReg === 'true') { var reg = linReg(pts); if (reg) { var y1 = reg.a + reg.b * xMin; var y2 = reg.a + reg.b * xMax; svg += '
'; svg += '
y = ' + reg.a.toFixed(3) + ' + ' + reg.b.toFixed(3) + 'x, R² = ' + reg.r2.toFixed(4) + '
'; } } if (xlabel) svg += '
' + escape(xlabel) + '
'; if (ylabel) svg += '
' + escape(ylabel) + '
'; svg += '
'; return svg; } var currentSVG = ''; function doProcess() { try { var textA = getVal('text-a'); if (!textA) { showError('请输入数据'); return; } var showReg = getVal('regression'); var title = getVal('title'); var xlabel = getVal('xlabel'); var ylabel = getVal('ylabel'); var pts = parseData(textA); if (pts.length === 0) { showError('无有效 (X,Y) 数据'); return; } var svg = renderScatterPlot(pts, showReg, title, xlabel, ylabel); currentSVG = svg; var reg = linReg(pts); var info = '数据点: ' + pts.length; if (reg) info += ', 回归 y=' + reg.a.toFixed(2) + '+' + reg.b.toFixed(2) + 'x, R²=' + reg.r2.toFixed(4); showResult(svg, info); } catch (e) { showError('处理失败: ' + (e.message || e)); } } $('btn-main').addEventListener('click', function(e) { e.preventDefault(); doProcess(); }); $('btn-clear').addEventListener('click', function() { var inputs = document.querySelectorAll('input,textarea,select'); for (var i = 0; i < inputs.length; i++) { if (inputs[i].tagName === 'SELECT') inputs[i].selectedIndex = 0; else inputs[i].value = inputs[i].defaultValue; } var ra = $('result-area'); ra.hidden = true; ra.style.display = 'none'; var em = $('error-msg'); em.hidden = true; em.style.display = 'none'; $('btn-download').style.display = 'none'; }); $('btn-download').addEventListener('click', function() { if (!currentSVG) return; var blob = new Blob([currentSVG], { type: 'image/svg+xml' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'scatter-plot.svg'; a.click(); URL.revokeObjectURL(url); }); })();