Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Datenkonvertierung
›
Startseite
manifest.json
0; }); var nums = []; for (var i = 0; i < tokens.length; i++) { var v = parseFloat(tokens[i]); if (!isNaN(v)) nums.push(v); } return nums; } function escape(s) { return String(s).replace(/[&<>"']/g, function(c) { return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]; }); } function renderHistogram(data, bins, title, xlabel, ylabel) { if (data.length === 0) return ''; var min = Math.min.apply(null, data); var max = Math.max.apply(null, data); if (min === max) { min -= 1; max += 1; } if (bins <= 0) bins = Math.max(1, Math.ceil(Math.log2(data.length) + 1)); bins = Math.min(bins, data.length); var binW = (max - min) / bins; var counts = new Array(bins).fill(0); for (var i = 0; i < data.length; i++) { var idx = Math.floor((data[i] - min) / binW); if (idx >= bins) idx = bins - 1; counts[idx]++; } var maxCount = Math.max.apply(null, counts); if (maxCount === 0) maxCount = 1; 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 barW = innerW / bins * 0.9; var gap = innerW / bins * 0.1; var svg = '
'; if (title) svg += '
' + escape(title) + '
'; svg += '
'; svg += '
'; for (var i = 0; i <= 5; i++) { var v = maxCount * (5 - i) / 5; var y = M.top + innerH * i / 5; svg += '
'; svg += '
' + Math.round(v) + '
'; } for (var k = 0; k < bins; k++) { var x = M.left + k * (barW + gap) + gap / 2; var h = (counts[k] / maxCount) * innerH; var y = M.top + innerH - h; svg += '
'; svg += '
' + (min + k * binW).toFixed(1) + '
'; svg += '
' + counts[k] + '
'; } 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 bins = parseInt(getVal('bins'), 10); var title = getVal('title'); var xlabel = getVal('xlabel'); var ylabel = getVal('ylabel'); var data = parseData(textA); if (data.length === 0) { showError('无有效数字'); return; } var svg = renderHistogram(data, bins, title, xlabel, ylabel); currentSVG = svg; showResult(svg, '数据点: ' + data.length + ', 范围: ' + Math.min.apply(null, data) + '~' + Math.max.apply(null, data) + ', 分箱: ' + (bins <= 0 ? 'auto' : bins)); } 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 = 'histogram.svg'; a.click(); URL.revokeObjectURL(url); }); })();