(function() {
const dom = document.getElementById('chart-scatter');
const myChart = echarts.init(dom);
const scatterData = [[31, 1], [33, 0], [14, 0], [35, 0], [41, 3]];
const xs = scatterData.map(d => d[0]), ys = scatterData.map(d => d[1]);
const n = xs.length, xm = xs.reduce((a, b) => a + b, 0) / n, ym = ys.reduce((a, b) => a + b, 0) / n;
let num = 0, den = 0;
for (let i = 0; i < n; i++) { num += (xs[i] - xm) * (ys[i] - ym); den += (xs[i] - xm) ** 2; }
const slope = den ? num / den : 0, intercept = ym - slope * xm;
const x1 = Math.min(...xs), x2 = Math.max(...xs);
myChart.setOption({
grid: { left: '12%', right: '8%', top: '10%', bottom: '12%' },
tooltip: { trigger: 'item', formatter: p => p.seriesName + '
X: ' + p.value[0] + '
Y: ' + p.value[1] },
xAxis: { type: 'value', name: 'X 轴' }, yAxis: { type: 'value', name: 'Y 轴' },
series: [
{ type: 'scatter', data: scatterData, symbolSize: 16, name: '数据点' },
{ type: 'line', name: '回归线', data: [[x1, slope * x1 + intercept], [x2, slope * x2 + intercept]], lineStyle: { type: 'dashed', color: '#f59e0b' }, symbol: 'none' }
]
});
window.addEventListener('resize', () => myChart.resize());
})();