1. 程式人生 > 實用技巧 >JS生成正太分佈資訊以及正太分佈圖

JS生成正太分佈資訊以及正太分佈圖

JS生成正太分佈資訊以及正太分佈圖
1.HTML程式碼

  <div>
        <textarea style="margin: 0px; width: 334px; height: 75px;" placeholder='"輸入所有組數由半形逗號分隔數字","'
            id="ZTText"></textarea>
        <button onclick="createInfo()" type="button">生成正太分佈資訊</button>
    </div>

    <div>
<p>結果</p> <label>資料總數:</label><label id="sjzs"></label><br /> <label>平均數:</label><label id="pjs"></label><br /> <label>標準差:</label><label id="stdev"></label><br /> <
label>方差:</label><label id="fc"></label><br /> <label>檢視:</label> <div id="main" style="width: 600px;height:400px;"></div> </div>

2.JS程式碼

        function createInfo() {
            var arrayText = document.getElementById("ZTText").value;
            arrayText 
= arrayText.replace(/\s/g, ''); var arrDayTEmp = arrayText.split(","); var arrDay = []; arrDayTEmp.forEach(function (item, index) { arrDay.push(item * 1.0) }); calc(arrDay); } // 數字格式化保留小數點後digit位數 function formatFloat(formula, digit) { var pow = Math.pow(10, digit); return parseInt(formula * pow, 10) / pow; }; /** * 計算標準正態分佈函式 * @param x 資料 * @param mean 平均值 * @param stdev 標準差 */ function normalDistribution(x, mean, stdev) { return (1 / (Math.sqrt(2 * Math.PI) * stdev)) * Math.exp(-1 * ((x - mean) * (x - mean)) / (2 * stdev * stdev)); } // 通過陣列計算生成正太資訊 function calc(arrDate) { // 臨時資料 var reqDates = []; reqDates = arrDate; // 臨時結果陣列 var tempResult = []; // 去重臨時結果陣列 var tempResultQC = []; // 平均值(期望) var mean = 0.0; // 標準差 var stdev = 0.0; // 總次數 var n = reqDates.length; // 陣列和 var datesSum = 0; reqDates.forEach(function (value, index) { datesSum += value; }); // 賦值平均值 mean = datesSum * 1.0 / n; var sumCha = 0; reqDates.forEach(function (value, index) { sumCha += (value - mean) * (value - mean) * 1.0; }); // 賦值標準差 stdev= Math.sqrt(sumCha / n); // 賦值臨時結果 reqDates.forEach(function (value, index) { tempResult.push({ x: value, rate: normalDistribution(value, mean, stdev) }); }); // 去重 tempResult.forEach(function (item, index) { var noX = tempResultQC.filter((x) => x.x == item.x).length == 0; if (noX) { tempResultQC.push(item); } }); // 排序 var res = tempResultQC.sort(compare('x')); // 獲取x,y資訊 xData = res.map(item => { return item.x }); yData = res.map(item => { return item.rate }); // 顯示正太分佈基本資訊 document.getElementById("sjzs").innerHTML = n; document.getElementById("pjs").innerHTML = formatFloat(mean, 2); document.getElementById("stdev").innerHTML = formatFloat(stdev, 2); document.getElementById("fc").innerHTML = formatFloat(stdev * stdev, 2); // 生成正太分佈圖 createView(xData, yData); } // 排序方法 function compare(property) { return function (a, b) { var value1 = a[property]; var value2 = b[property]; return value1 - value2;// 升序,降序為value2 - value1 }; } // 生成檢視 function createView(xData, yData) { var colors = ['#7CCD7C', '#d14a61', '#675bba']; var option = { color: colors, tooltip: { trigger: 'axis', axisPointer: { type: 'cross' } }, grid: { right: '20%' }, toolbox: { feature: { dataView: { show: true, readOnly: false }, restore: { show: true }, saveAsImage: { show: true } } }, legend: { data: ['正態分佈'] }, xAxis: [{ type: 'category', axisTick: { alignWithLabel: true }, data: xData }], yAxis: [{ type: 'value', position: 'left', }, { type: 'value', position: 'right' } ], series: [{ name: '正態分佈', type: 'line', animation: false, showSymbol: false, itemStyle: { color: "red" }, data: yData }, ] }; // 基於準備好的dom,初始化echarts例項 var myChart = echarts.init(document.getElementById('main')); // 使用剛指定的配置項和資料顯示圖表。 myChart.setOption(option); }