1143 lines
39 KiB
JavaScript
1143 lines
39 KiB
JavaScript
|
||
|
||
//arr1是数据源
|
||
let set = $("#data").html();
|
||
$("#TestLogsData").html(set);
|
||
var list = set.split(',');
|
||
var arr1 = new Array(); //创建一个空数组
|
||
for (var i = 0; i < list.length; i++) {
|
||
arr1.push(Number(list[i]));
|
||
}
|
||
|
||
|
||
var total = 0;
|
||
for (var i = 0; i < arr1.length; i++) {
|
||
total += arr1[i];
|
||
}
|
||
|
||
|
||
|
||
|
||
var mCharts = echarts.init(document.getElementById('stesy'));
|
||
|
||
option = {
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
position: function (pt) {
|
||
return [pt[0], '10%'];
|
||
}
|
||
},
|
||
title: {
|
||
left: 'center',
|
||
},
|
||
toolbox: {
|
||
feature: {
|
||
dataZoom: {
|
||
yAxisIndex: 'none'
|
||
},
|
||
restore: {},
|
||
saveAsImage: {}
|
||
}
|
||
},
|
||
xAxis: {
|
||
type: 'category',
|
||
boundaryGap: false,
|
||
data: arr1
|
||
},
|
||
yAxis: {
|
||
type: 'value',
|
||
boundaryGap: [0, '100%']
|
||
},
|
||
dataZoom: [
|
||
{
|
||
type: 'inside',
|
||
start: 0,
|
||
end: 10
|
||
},
|
||
{
|
||
start: 0,
|
||
end: 10
|
||
}
|
||
],
|
||
series: [
|
||
{
|
||
type: 'line',
|
||
symbol: 'none',
|
||
sampling: 'lttb',
|
||
itemStyle: {
|
||
color: 'rgb(26,179,148)'
|
||
},
|
||
areaStyle: {
|
||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||
{
|
||
offset: 0,
|
||
color: 'rgb(26,179,148)'
|
||
},
|
||
{
|
||
offset: 1,
|
||
color: 'rgb(26,179,148)'
|
||
}
|
||
])
|
||
},
|
||
data: arr1
|
||
}
|
||
]
|
||
};
|
||
|
||
|
||
|
||
//option = {
|
||
////title: {
|
||
//// text: '未来一周气温变化',
|
||
//// subtext: '纯属虚构'
|
||
////},
|
||
//tooltip: {
|
||
// trigger: 'axis'
|
||
//},
|
||
////legend: {
|
||
//// data: ['最高气温']
|
||
////},
|
||
//xAxis: {
|
||
// type: 'category',
|
||
// /* boundaryGap: false,*/
|
||
// data: arr1
|
||
//},
|
||
//yAxis: {
|
||
|
||
// min: Math.min.apply(Math, arr1),
|
||
// max: Math.max.apply(Math, arr1),
|
||
// type: 'value',
|
||
// axisLabel: {
|
||
// formatter: '{value} '
|
||
// }
|
||
//},
|
||
//series: [
|
||
// {
|
||
// type: 'bar',
|
||
// data: arr1,
|
||
// markLine: {
|
||
// data: [
|
||
// { type: 'average', name: '平均值', lineStyle: { color: 'green', type: 'solid', width: 4 } },
|
||
// { type: 'max', name: '最大值' },
|
||
// { type: 'min', name: '最小值' },
|
||
// ]
|
||
// },
|
||
// },
|
||
|
||
//]
|
||
//};
|
||
mCharts.setOption(option);
|
||
|
||
//mCharts.on('mousemove', function (params) {
|
||
// // 控制台打印数据的名称
|
||
// console.log(params);
|
||
///* console.log(arr1)*/
|
||
// var arr21 = new Array(); //创建一个空数组
|
||
// if (params.componentType == "series") {
|
||
|
||
// for (var i = 0; i <= params.dataIndex; i++) {
|
||
// arr21.push(arr1[i])
|
||
// }
|
||
// }
|
||
// if (arr21.length > 0) {
|
||
// let sun = 0;
|
||
// for (var i = 0; i < arr21.length; i++) {
|
||
// sun += arr21[i]
|
||
// }
|
||
// let pingjzhi = sun / arr21.length
|
||
// console.log(arr21)
|
||
// console.log(pingjzhi)
|
||
// }
|
||
|
||
//});
|
||
|
||
|
||
|
||
|
||
var app = new Vue({
|
||
el: '#app',
|
||
data: {
|
||
// 首页正态曲线的计算公式
|
||
mathJax: '`f(x) = (1 / (\sqrt {2\pi} \sigma)) e^(-(x-\mu)^2/(2\sigma^2))`',
|
||
// 数据源(从隔壁的 js 文件中引入)
|
||
json: {
|
||
"R1": [], "R2": [], "R3": [] },
|
||
// 页面中输入的数据。初始默认为 json 文件
|
||
input: '', // 数组的 watch 监听不太方便处理
|
||
// 是否为样本数据
|
||
isSample: true,
|
||
|
||
},
|
||
watch: {
|
||
|
||
// 监听输入框,即时更新图形
|
||
input: function (val) {
|
||
this.input = val;
|
||
this.loadChartsSeried() // 加载数据
|
||
this.initChartsData('chart') // 生成 Echarts 图
|
||
},
|
||
},
|
||
computed: {
|
||
|
||
/**
|
||
* @Description: 获取数据源
|
||
w
|
||
* @Date: 2020-11-27 14:56:w
|
||
* */
|
||
data: {
|
||
get() {
|
||
// 因为数组的监听不太好处理,所以多转换一次
|
||
return this.input.split(',').map(t => parseFloat(t))
|
||
},
|
||
set(v) {
|
||
// 如果给 data 赋值,只能是数组类型
|
||
if (!(v instanceof Array)) return
|
||
// 同步更新 input 的值
|
||
this.input = v.join(',')
|
||
}
|
||
},
|
||
/**
|
||
* @Description: 有序数据源(方便操作)
|
||
|
||
* @Date: 2020-11-28 14:17:24
|
||
* */
|
||
dataOrderBy() {
|
||
const data = this.data.concat([]); // 为防止 sort 方法修改原数组,对原数组进行拷贝,操作副本。
|
||
return data.sort((a, b) => a - b)
|
||
},
|
||
/**
|
||
* @Description: 数据整理。原数据整理为:{数据值 : 数据频率}
|
||
|
||
* @Date: 2020-11-28 13:59:12
|
||
* */
|
||
dataAfterClean() {
|
||
let res = {}
|
||
const data = this.dataOrderBy
|
||
for (let i = 0; i < this.data.length; i++) {
|
||
let key = parseFloat(this.data[i]).toFixed(1) // 这里保留 1 位小数
|
||
if (key !== "NaN" && parseFloat(key) === 0)
|
||
key = "0.0" //这个判断用来处理保留小数位后 -0.0 和 0.0 判定为不同 key 的 bug
|
||
if (res[key])
|
||
res[key] += 1
|
||
else
|
||
res[key] = 1
|
||
}
|
||
return res
|
||
},
|
||
|
||
|
||
/**
|
||
* @Description: 数据整理。返回源数据所有值(排序后)
|
||
|
||
* @Date: 2020-11-28 14:35:52
|
||
* */
|
||
dataAfterCleanX() {
|
||
return Object.keys(this.dataAfterClean).sort((a, b) => a - b).map(t => parseFloat(t)
|
||
.toFixed(1)) // 保留 1 位小数
|
||
// return Object.keys(this.dataAfterClean) // 不保证顺序一致
|
||
},
|
||
/**
|
||
* @Description: 数据整理。返回源数据所有值对应的频率(排序后) -- 与 dataAfterCleanX 顺序一致
|
||
|
||
* @Date: 2020-11-28 13:59:12
|
||
* */
|
||
dataAfterCleanY() {
|
||
let r = []
|
||
for (let i = 0; i < this.dataAfterCleanX.length; i++) {
|
||
r.push(this.dataAfterClean[this.dataAfterCleanX[i]])
|
||
}
|
||
return r
|
||
},
|
||
/**
|
||
* @Description: 数据整理。返回源数据所有值对应的频率,刻度更细致(保留 2 位小数) -- 与 dataAfterCleanX 顺序一致
|
||
|
||
* @Date: 2020-11-29 13:59:22
|
||
* */
|
||
dataAfterCleanXSub() {
|
||
let r = []
|
||
for (let i = parseFloat(this.min.toFixed(1)); i <= parseFloat(this.max.toFixed(1)); i +=
|
||
0.01)
|
||
r.push(i.toFixed(2))
|
||
//console.log(r)
|
||
return r
|
||
},
|
||
|
||
/**
|
||
* @Description: 计算平均数。这里的平均数指的是数学期望、算术平均数
|
||
|
||
* @Date: 2020-11-27 15:24:14
|
||
* */
|
||
sum() {
|
||
if (this.data.length === 0) return 0
|
||
return this.data.reduce((prev, curr) => prev + curr)
|
||
},
|
||
/**
|
||
* @Description: 计算平均数。这里的平均数指的是数学期望、算术平均数
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
average() {
|
||
return this.sum / this.data.length
|
||
},
|
||
/**
|
||
* @Description: 计算众数
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
mode() {
|
||
return 0
|
||
},
|
||
/**
|
||
* @Description: 计算中位数
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
median() {
|
||
const data = this.dataOrderBy
|
||
return (data[(data.length - 1) >> 1] + data[data.length >> 1]) / 2
|
||
},
|
||
/**
|
||
* @Description: 计算偏差
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
deviation() {
|
||
// 1、求平均数
|
||
const avg = this.average
|
||
// 2、返回偏差。 f(x) = x - avg
|
||
return this.data.map(x => x - avg)
|
||
},
|
||
/**
|
||
* @Description: 计算总体/样本方差
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
variance() {
|
||
if (this.data.length === 0) return 0
|
||
// 1、求偏差
|
||
const dev = this.deviation
|
||
// 2、求偏差平方和
|
||
const sumOfSquOfDev = dev.map(x => x * x).reduce((x, y) => x + y)
|
||
// 3、返回方差
|
||
return sumOfSquOfDev / (this.isSample ? (this.data.length - 1) : this.data.length)
|
||
},
|
||
/**
|
||
* @Description: 计算总体/样本标准差
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
standardDeviation() {
|
||
return Math.sqrt(this.variance)
|
||
},
|
||
/**
|
||
* @Description: 计算一倍标准差范围
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
standarDevRangeOfOne() {
|
||
return {
|
||
low: this.average - 1 * this.standardDeviation,
|
||
up: this.average + 1 * this.standardDeviation
|
||
}
|
||
},
|
||
/**
|
||
* @Description: 计算三倍标准差范围
|
||
|
||
* @Date: 2020-11-27 15:29:43
|
||
* */
|
||
standarDevRangeOfTwo() {
|
||
return {
|
||
low: this.average - 2 * this.standardDeviation,
|
||
up: this.average + 2 * this.standardDeviation
|
||
}
|
||
},
|
||
/**
|
||
* @Description: 计算三倍标准差范围
|
||
|
||
* @Date: 2020-11-27 15:30:49
|
||
* */
|
||
standarDevRangeOfThree() {
|
||
return {
|
||
low: this.average - 3 * this.standardDeviation,
|
||
up: this.average + 3 * this.standardDeviation
|
||
}
|
||
},
|
||
/**
|
||
* @Description: 计算最小值
|
||
|
||
* @Date: 2020-11-28 13:19:06
|
||
* */
|
||
min() {
|
||
return Math.min.apply(null, this.data)
|
||
},
|
||
/**
|
||
* @Description: 计算最大值
|
||
|
||
* @Date: 2020-11-28 13:21:16
|
||
* */
|
||
max() {
|
||
return Math.max.apply(null, this.data)
|
||
},
|
||
/**
|
||
* @Description: 正态分布(高斯分布)计算公式
|
||
|
||
* @Date: 2020-11-28 13:46:18
|
||
* */
|
||
normalDistribution() {
|
||
// 计算公式: `f(x) = (1 / (\sqrt {2\pi} \sigma)) e^(-(x-\mu)^2/(2\sigma^2))`
|
||
// return (1 / Math.sqrt(2 * Math.PI) * a) * (Math.exp(-1 * ((x - u) * (x - u)) / (2 * a * a)))
|
||
let res = []
|
||
for (let i = 0; i < this.dataAfterCleanX.length; i++) {
|
||
const x = this.dataAfterCleanX[i]
|
||
const a = this.standardDeviation
|
||
const u = this.average
|
||
const y = (1 / (Math.sqrt(2 * Math.PI) * a)) * (Math.exp(-1 * ((x - u) * (x - u)) / (2 *
|
||
a * a)))
|
||
res.push(y)
|
||
}
|
||
return res
|
||
},
|
||
|
||
//Averagemarks() {
|
||
// var yArr = [];
|
||
// var sumFuc = (s, c) => formulaCalcByFunc(s + c, 6);//求和匿名函数,formulaCalc为了减少精度误差,可以自己写;
|
||
// var ysum = this.data.reduce(sumFuc, 0)
|
||
// for (var n = 0; n < this.data.length; n++) {
|
||
// var y = this.data[n] / ysum;
|
||
// yArr.push(y);
|
||
// }
|
||
// var avg = math.mean(yArr);
|
||
//},
|
||
|
||
AveragemarksRang() {
|
||
return (this.max - this.min)/11;
|
||
},
|
||
},
|
||
created() {},
|
||
mounted() {
|
||
|
||
|
||
this.data = arr1;
|
||
this.loadChartsSeried() // 加载数据
|
||
this.initChartsData('chart') // 生成 Echarts 图
|
||
|
||
|
||
},
|
||
|
||
methods: {
|
||
|
||
|
||
numFilter(value) {
|
||
|
||
const realVal = parseFloat(value).toFixed(2);
|
||
|
||
return realVal;
|
||
|
||
},
|
||
|
||
|
||
/**
|
||
* @Description: 加载 Echarts 图所需数据
|
||
*
|
||
* @Params url
|
||
*
|
||
* @return
|
||
|
||
* @Date: 2020-11-27 13:24:26
|
||
* */
|
||
loadChartsSeried() {
|
||
this.json = this.json
|
||
},
|
||
|
||
|
||
/**
|
||
* @Description: 生成 Echarts 图
|
||
*
|
||
* @Params ref:容器
|
||
*
|
||
* @return
|
||
|
||
* @Date: 2020-11-27 13:23:26
|
||
* */
|
||
initChartsData(ref) {
|
||
let chart = this.$refs[ref]
|
||
if (!chart) return
|
||
chart = echarts.init(chart)
|
||
// Echarts 图的配置
|
||
let options = {
|
||
// Echarts 图 -- 标题
|
||
title: {
|
||
//text: 'Echarts 绘制正态分布曲线(有 3 组示例数据,刷新随机显示)'
|
||
},
|
||
// Echarts 图 -- 工具
|
||
tooltip: {},
|
||
// Echarts 图 -- 图例
|
||
legend: {
|
||
data: ['f(x)']
|
||
},
|
||
// Echarts 图 -- x 坐标轴刻度 -- 正态分布数值
|
||
xAxis: [{
|
||
// name : "标准刻度(0.1)",
|
||
data: this.dataAfterCleanX,
|
||
// min: this.min,
|
||
// max: this.max
|
||
}],
|
||
// Echarts 图 -- y 坐标轴刻度
|
||
yAxis: [{
|
||
type: 'value',
|
||
//name: '频数',
|
||
position: 'left',
|
||
// 网格线
|
||
splitLine: {
|
||
show: false
|
||
},
|
||
axisLine: {
|
||
lineStyle: {
|
||
color: 'orange'
|
||
}
|
||
},
|
||
axisLabel: {
|
||
formatter: '{value}'
|
||
}
|
||
},
|
||
{
|
||
type: 'value',
|
||
//name: '概率',
|
||
position: 'right',
|
||
// 网格线
|
||
splitLine: {
|
||
show: false
|
||
},
|
||
axisLine: {
|
||
lineStyle: {
|
||
color: 'black'
|
||
}
|
||
},
|
||
axisLabel: {
|
||
formatter: '{value}'
|
||
}
|
||
},
|
||
],
|
||
// Echarts 图 -- y 轴数据
|
||
series: [{
|
||
name: '源数据', // y 轴名称
|
||
type: 'bar', // y 轴类型
|
||
yAxisIndex: 0,
|
||
barGap: 0,
|
||
barWidth: 27,
|
||
itemStyle: {
|
||
normal: {
|
||
show: true,
|
||
color: '#1ab394', //柱子颜色
|
||
borderColor: '#FF7F50' //边框颜色
|
||
}
|
||
},
|
||
data: this.dataAfterCleanY, // y 轴数据 -- 源数据
|
||
}, {
|
||
name: '正态分布', // y 轴名称
|
||
type: 'line', // y 轴类型
|
||
symbol: 'none', //去掉折线图中的节点
|
||
smooth: true, //true 为平滑曲线
|
||
yAxisIndex: 1,
|
||
data: this.normalDistribution, // y 轴数据 -- 正态分布
|
||
// 警示线
|
||
markLine: {
|
||
symbol: ['none'], // 箭头方向
|
||
lineStyle: {
|
||
type: "silent",
|
||
color: "green",
|
||
},
|
||
itemStyle: {
|
||
normal: {
|
||
show: true,
|
||
color: 'black'
|
||
}
|
||
},
|
||
label: {
|
||
show: true,
|
||
position: "middle"
|
||
},
|
||
data: [{
|
||
name: '一倍标准差',
|
||
xAxis: this.standarDevRangeOfOne.low.toFixed(1),
|
||
// 当 n 倍标准差在坐标轴外时,将其隐藏,否则它会默认显示在最小值部分,容易引起混淆
|
||
lineStyle: {
|
||
opacity: (this.min > this.standarDevRangeOfOne
|
||
.low) ? 0 : 1
|
||
},
|
||
label: {
|
||
show: !(this.min > this.standarDevRangeOfOne.low)
|
||
}
|
||
}, {
|
||
name: '一倍标准差',
|
||
xAxis: this.standarDevRangeOfOne.up.toFixed(1),
|
||
lineStyle: {
|
||
opacity: (this.max < this.standarDevRangeOfOne.up) ?
|
||
0 : 1
|
||
},
|
||
label: {
|
||
show: !(this.max < this.standarDevRangeOfOne.up)
|
||
}
|
||
}, {
|
||
name: '二倍标准差',
|
||
xAxis: this.standarDevRangeOfTwo.low.toFixed(1),
|
||
lineStyle: {
|
||
opacity: (this.min > this.standarDevRangeOfTwo
|
||
.low) ? 0 : 1
|
||
},
|
||
label: {
|
||
show: !(this.min > this.standarDevRangeOfTwo.low)
|
||
}
|
||
}, {
|
||
name: '二倍标准差',
|
||
xAxis: this.standarDevRangeOfTwo.up.toFixed(1),
|
||
lineStyle: {
|
||
opacity: (this.max < this.standarDevRangeOfTwo
|
||
.up) ? 0 : 1
|
||
},
|
||
label: {
|
||
show: !(this.max < this.standarDevRangeOfTwo.up)
|
||
}
|
||
}, {
|
||
name: '三倍标准差',
|
||
xAxis: this.standarDevRangeOfThree.low.toFixed(1),
|
||
lineStyle: {
|
||
opacity: (this.min > this.standarDevRangeOfThree
|
||
.low) ? 0 : 1
|
||
},
|
||
label: {
|
||
show: !(this.min > this.standarDevRangeOfThree.low)
|
||
}
|
||
}, {
|
||
name: '三倍标准差',
|
||
xAxis: this.standarDevRangeOfThree.up.toFixed(1),
|
||
lineStyle: {
|
||
opacity: (this.max < this.standarDevRangeOfThree
|
||
.up) ? 0 : 1
|
||
},
|
||
label: {
|
||
show: !(this.max < this.standarDevRangeOfThree.up)
|
||
}
|
||
}, {
|
||
name: '平均值',
|
||
// type: 'average',
|
||
xAxis: this.average.toFixed(1),
|
||
lineStyle: {
|
||
color: 'red'
|
||
}
|
||
}, ]
|
||
}
|
||
}],
|
||
|
||
}
|
||
chart.setOption(options)
|
||
window.addEventListener("resize", () => {
|
||
chart.resize()
|
||
})
|
||
},
|
||
}
|
||
})
|
||
|
||
|
||
|
||
|
||
|
||
var app2 = new Vue({
|
||
el: '#app2',
|
||
data: {
|
||
// 首页正态曲线的计算公式
|
||
mathJax: '`f(x) = (1 / (\sqrt {2\pi} \sigma)) e^(-(x-\mu)^2/(2\sigma^2))`',
|
||
// 数据源(从隔壁的 js 文件中引入)
|
||
json: {
|
||
"R1": [], "R2": [], "R3": []
|
||
},
|
||
// 页面中输入的数据。初始默认为 json 文件
|
||
input: '', // 数组的 watch 监听不太方便处理
|
||
// 是否为样本数据
|
||
isSample: true,
|
||
|
||
datares: "",
|
||
},
|
||
watch: {
|
||
// 监听输入框,即时更新图形
|
||
input: function (val) {
|
||
this.input = val;
|
||
this.loadChartsSeried() // 加载数据
|
||
this.initChartsData('chart') // 生成 Echarts 图
|
||
},
|
||
},
|
||
computed: {
|
||
|
||
/**
|
||
* @Description: 获取数据源
|
||
w
|
||
* @Date: 2020-11-27 14:56:w
|
||
* */
|
||
data: {
|
||
get() {
|
||
// 因为数组的监听不太好处理,所以多转换一次
|
||
return this.input.split(',').map(t => parseFloat(t))
|
||
},
|
||
set(v) {
|
||
// 如果给 data 赋值,只能是数组类型
|
||
if (!(v instanceof Array)) return
|
||
// 同步更新 input 的值
|
||
this.input = v.join(',')
|
||
}
|
||
},
|
||
/**
|
||
* @Description: 有序数据源(方便操作)
|
||
|
||
* @Date: 2020-11-28 14:17:24
|
||
* */
|
||
dataOrderBy() {
|
||
const data = this.data.concat([]); // 为防止 sort 方法修改原数组,对原数组进行拷贝,操作副本。
|
||
return data.sort((a, b) => a - b)
|
||
},
|
||
/**
|
||
* @Description: 数据整理。原数据整理为:{数据值 : 数据频率}
|
||
|
||
* @Date: 2020-11-28 13:59:12
|
||
* */
|
||
|
||
dataAfterClean() {
|
||
let res = {}
|
||
for (var i = 0; i < 11; i++) {
|
||
//分成11份
|
||
var res1 = this.min + (this.AveragemarksRang * i);
|
||
res1 = String(res1);
|
||
if (res1.indexOf(".") != -1) {
|
||
//有小数点就截取小数点后两位
|
||
res1 = res1.substring(0, res1.indexOf(".") + 3);
|
||
} else {
|
||
//没有小数点就添加两位
|
||
res1 = res1+".00"
|
||
}
|
||
if (res1.length != 5) {
|
||
//判断长度是否符合柱形图的小数点后两位
|
||
res1 = res1+"0"
|
||
}
|
||
res[res1] = 0;
|
||
}
|
||
var reskey = Object.keys(res);
|
||
for (var i = 0; i < this.data.length; i++) {
|
||
for (var tmp in res) {
|
||
let key = parseFloat(this.data[i]) // 这里保留 1 位小数
|
||
if (key !== "NaN" && parseFloat(key) === 0) {
|
||
key = "0.0" //这个判断用来处理保留小数位后 -0.0 和 0.0 判定为不同 key 的 bug
|
||
}
|
||
if (key <= tmp) {
|
||
res[tmp] += 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
for (var i = 0; i < res.length; i++) {
|
||
}
|
||
this.datares = res;
|
||
return res
|
||
},
|
||
|
||
/**
|
||
* @Description: 数据整理。返回源数据所有值(排序后)
|
||
|
||
* @Date: 2020-11-28 14:35:52
|
||
* */
|
||
dataAfterCleanX() {
|
||
return Object.keys(this.dataAfterClean).sort((a, b) => a - b).map(t => parseFloat(t)
|
||
.toFixed(2)) // 保留 1 位小数
|
||
// return Object.keys(this.dataAfterClean) // 不保证顺序一致
|
||
},
|
||
/**
|
||
* @Description: 数据整理。返回源数据所有值对应的频率(排序后) -- 与 dataAfterCleanX 顺序一致
|
||
|
||
* @Date: 2020-11-28 13:59:12
|
||
* */
|
||
dataAfterCleanY() {
|
||
let r = []
|
||
for (let i = 0; i < this.dataAfterCleanX.length; i++) {
|
||
r.push(this.dataAfterClean[this.dataAfterCleanX[i]])
|
||
}
|
||
return r
|
||
},
|
||
/**
|
||
* @Description: 数据整理。返回源数据所有值对应的频率,刻度更细致(保留 2 位小数) -- 与 dataAfterCleanX 顺序一致
|
||
|
||
* @Date: 2020-11-29 13:59:22
|
||
* */
|
||
dataAfterCleanXSub() {
|
||
let r = []
|
||
for (let i = parseFloat(this.min.toFixed(1)); i <= parseFloat(this.max.toFixed(1)); i +=
|
||
0.01)
|
||
r.push(i.toFixed(2))
|
||
//console.log(r)
|
||
return r
|
||
},
|
||
|
||
/**
|
||
* @Description: 计算平均数。这里的平均数指的是数学期望、算术平均数
|
||
|
||
* @Date: 2020-11-27 15:24:14
|
||
* */
|
||
sum() {
|
||
if (this.data.length === 0) return 0
|
||
return this.data.reduce((prev, curr) => prev + curr)
|
||
},
|
||
/**
|
||
* @Description: 计算平均数。这里的平均数指的是数学期望、算术平均数
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
average() {
|
||
return this.sum / this.data.length
|
||
},
|
||
/**
|
||
* @Description: 计算众数
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
mode() {
|
||
return 0
|
||
},
|
||
/**
|
||
* @Description: 计算中位数
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
median() {
|
||
const data = this.dataOrderBy
|
||
return (data[(data.length - 1) >> 1] + data[data.length >> 1]) / 2
|
||
},
|
||
/**
|
||
* @Description: 计算偏差
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
deviation() {
|
||
// 1、求平均数
|
||
const avg = this.average
|
||
// 2、返回偏差。 f(x) = x - avg
|
||
return this.data.map(x => x - avg)
|
||
},
|
||
/**
|
||
* @Description: 计算总体/样本方差
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
variance() {
|
||
if (this.data.length === 0) return 0
|
||
// 1、求偏差
|
||
const dev = this.deviation
|
||
// 2、求偏差平方和
|
||
const sumOfSquOfDev = dev.map(x => x * x).reduce((x, y) => x + y)
|
||
// 3、返回方差
|
||
return sumOfSquOfDev / (this.isSample ? (this.data.length - 1) : this.data.length)
|
||
},
|
||
/**
|
||
* @Description: 计算总体/样本标准差
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
standardDeviation() {
|
||
return Math.sqrt(this.variance)
|
||
},
|
||
/**
|
||
* @Description: 计算一倍标准差范围
|
||
|
||
* @Date: 2020-11-27 15:26:03
|
||
* */
|
||
standarDevRangeOfOne() {
|
||
return {
|
||
low: this.average - 1 * this.standardDeviation,
|
||
up: this.average + 1 * this.standardDeviation
|
||
}
|
||
},
|
||
/**
|
||
* @Description: 计算三倍标准差范围
|
||
|
||
* @Date: 2020-11-27 15:29:43
|
||
* */
|
||
standarDevRangeOfTwo() {
|
||
return {
|
||
low: this.average - 2 * this.standardDeviation,
|
||
up: this.average + 2 * this.standardDeviation
|
||
}
|
||
},
|
||
/**
|
||
* @Description: 计算三倍标准差范围
|
||
|
||
* @Date: 2020-11-27 15:30:49
|
||
* */
|
||
standarDevRangeOfThree() {
|
||
return {
|
||
low: this.average - 3 * this.standardDeviation,
|
||
up: this.average + 3 * this.standardDeviation
|
||
}
|
||
},
|
||
/**
|
||
* @Description: 计算最小值
|
||
|
||
* @Date: 2020-11-28 13:19:06
|
||
* */
|
||
min() {
|
||
return Math.min.apply(null, this.data)
|
||
},
|
||
/**
|
||
* @Description: 计算最大值
|
||
|
||
* @Date: 2020-11-28 13:21:16
|
||
* */
|
||
max() {
|
||
return Math.max.apply(null, this.data)
|
||
},
|
||
/**
|
||
* @Description: 正态分布(高斯分布)计算公式
|
||
|
||
* @Date: 2020-11-28 13:46:18
|
||
* */
|
||
normalDistribution() {
|
||
// 计算公式: `f(x) = (1 / (\sqrt {2\pi} \sigma)) e^(-(x-\mu)^2/(2\sigma^2))`
|
||
// return (1 / Math.sqrt(2 * Math.PI) * a) * (Math.exp(-1 * ((x - u) * (x - u)) / (2 * a * a)))
|
||
let res = []
|
||
for (let i = 0; i < this.dataAfterCleanX.length; i++) {
|
||
const x = this.dataAfterCleanX[i]
|
||
const a = this.standardDeviation
|
||
const u = this.average
|
||
const y = (1 / (Math.sqrt(2 * Math.PI) * a)) * (Math.exp(-1 * ((x - u) * (x - u)) / (2 *
|
||
a * a)))
|
||
res.push(y)
|
||
}
|
||
return res
|
||
},
|
||
|
||
|
||
AveragemarksRang() {
|
||
return (this.max - this.min) / 11;
|
||
},
|
||
|
||
|
||
},
|
||
created() { },
|
||
mounted() {
|
||
|
||
|
||
this.data = arr1;
|
||
this.loadChartsSeried() // 加载数据
|
||
this.initChartsData('chart') // 生成 Echarts 图
|
||
|
||
|
||
},
|
||
|
||
methods: {
|
||
|
||
|
||
numFilter(value) {
|
||
|
||
const realVal = parseFloat(value).toFixed(2);
|
||
|
||
return realVal;
|
||
|
||
},
|
||
|
||
|
||
/**
|
||
* @Description: 加载 Echarts 图所需数据
|
||
*
|
||
* @Params url
|
||
*
|
||
* @return
|
||
|
||
* @Date: 2020-11-27 13:24:26
|
||
* */
|
||
loadChartsSeried() {
|
||
this.json = this.json
|
||
},
|
||
|
||
|
||
/**
|
||
* @Description: 生成 Echarts 图
|
||
*
|
||
* @Params ref:容器
|
||
*
|
||
* @return
|
||
|
||
* @Date: 2020-11-27 13:23:26
|
||
* */
|
||
initChartsData(ref) {
|
||
let chart = this.$refs[ref]
|
||
if (!chart) return
|
||
chart = echarts.init(chart)
|
||
// Echarts 图的配置
|
||
let options = {
|
||
// Echarts 图 -- 标题
|
||
title: {
|
||
//text: 'Echarts 绘制正态分布曲线(有 3 组示例数据,刷新随机显示)'
|
||
},
|
||
// Echarts 图 -- 工具
|
||
tooltip: {},
|
||
// Echarts 图 -- 图例
|
||
legend: {
|
||
data: ['f(x)']
|
||
},
|
||
// Echarts 图 -- x 坐标轴刻度 -- 正态分布数值
|
||
xAxis: [{
|
||
// name : "标准刻度(0.1)",
|
||
data: this.dataAfterCleanX,
|
||
// min: this.min,
|
||
// max: this.max
|
||
}],
|
||
// Echarts 图 -- y 坐标轴刻度
|
||
yAxis: [{
|
||
type: 'value',
|
||
//name: '频数',
|
||
position: 'left',
|
||
// 网格线
|
||
splitLine: {
|
||
show: false
|
||
},
|
||
axisLine: {
|
||
lineStyle: {
|
||
color: 'orange'
|
||
}
|
||
},
|
||
axisLabel: {
|
||
formatter: '{value}'
|
||
}
|
||
},
|
||
{
|
||
type: 'value',
|
||
//name: '概率',
|
||
position: 'right',
|
||
// 网格线
|
||
splitLine: {
|
||
show: false
|
||
},
|
||
axisLine: {
|
||
lineStyle: {
|
||
color: 'black'
|
||
}
|
||
},
|
||
axisLabel: {
|
||
formatter: '{value}'
|
||
}
|
||
},
|
||
],
|
||
// Echarts 图 -- y 轴数据
|
||
series: [{
|
||
name: '源数据', // y 轴名称
|
||
type: 'bar', // y 轴类型
|
||
yAxisIndex: 0,
|
||
barGap: 0,
|
||
barWidth: 27,
|
||
itemStyle: {
|
||
normal: {
|
||
show: true,
|
||
color: '#1ab394', //柱子颜色
|
||
borderColor: '#FF7F50' //边框颜色
|
||
}
|
||
},
|
||
data: this.dataAfterCleanY, // y 轴数据 -- 源数据
|
||
}, {
|
||
name: '正态分布', // y 轴名称
|
||
type: 'line', // y 轴类型
|
||
symbol: 'none', //去掉折线图中的节点
|
||
smooth: true, //true 为平滑曲线
|
||
yAxisIndex: 1,
|
||
//data: this.normalDistribution, // y 轴数据 -- 正态分布
|
||
// 警示线
|
||
//markLine: {
|
||
// symbol: ['none'], // 箭头方向
|
||
// lineStyle: {
|
||
// type: "silent",
|
||
// color: "green",
|
||
// },
|
||
// itemStyle: {
|
||
// normal: {
|
||
// show: true,
|
||
// color: 'black'
|
||
// }
|
||
// },
|
||
// label: {
|
||
// show: true,
|
||
// position: "middle"
|
||
// },
|
||
// data: [{
|
||
// name: '一倍标准差',
|
||
// xAxis: this.standarDevRangeOfOne.low.toFixed(1),
|
||
// // 当 n 倍标准差在坐标轴外时,将其隐藏,否则它会默认显示在最小值部分,容易引起混淆
|
||
// lineStyle: {
|
||
// opacity: (this.min > this.standarDevRangeOfOne
|
||
// .low) ? 0 : 1
|
||
// },
|
||
// label: {
|
||
// show: !(this.min > this.standarDevRangeOfOne.low)
|
||
// }
|
||
// }, {
|
||
// name: '一倍标准差',
|
||
// xAxis: this.standarDevRangeOfOne.up.toFixed(1),
|
||
// lineStyle: {
|
||
// opacity: (this.max < this.standarDevRangeOfOne.up) ?
|
||
// 0 : 1
|
||
// },
|
||
// label: {
|
||
// show: !(this.max < this.standarDevRangeOfOne.up)
|
||
// }
|
||
// }, {
|
||
// name: '二倍标准差',
|
||
// xAxis: this.standarDevRangeOfTwo.low.toFixed(1),
|
||
// lineStyle: {
|
||
// opacity: (this.min > this.standarDevRangeOfTwo
|
||
// .low) ? 0 : 1
|
||
// },
|
||
// label: {
|
||
// show: !(this.min > this.standarDevRangeOfTwo.low)
|
||
// }
|
||
// }, {
|
||
// name: '二倍标准差',
|
||
// xAxis: this.standarDevRangeOfTwo.up.toFixed(1),
|
||
// lineStyle: {
|
||
// opacity: (this.max < this.standarDevRangeOfTwo
|
||
// .up) ? 0 : 1
|
||
// },
|
||
// label: {
|
||
// show: !(this.max < this.standarDevRangeOfTwo.up)
|
||
// }
|
||
// }, {
|
||
// name: '三倍标准差',
|
||
// xAxis: this.standarDevRangeOfThree.low.toFixed(1),
|
||
// lineStyle: {
|
||
// opacity: (this.min > this.standarDevRangeOfThree
|
||
// .low) ? 0 : 1
|
||
// },
|
||
// label: {
|
||
// show: !(this.min > this.standarDevRangeOfThree.low)
|
||
// }
|
||
// }, {
|
||
// name: '三倍标准差',
|
||
// xAxis: this.standarDevRangeOfThree.up.toFixed(1),
|
||
// lineStyle: {
|
||
// opacity: (this.max < this.standarDevRangeOfThree
|
||
// .up) ? 0 : 1
|
||
// },
|
||
// label: {
|
||
// show: !(this.max < this.standarDevRangeOfThree.up)
|
||
// }
|
||
// }, {
|
||
// name: '平均值',
|
||
// // type: 'average',
|
||
// xAxis: this.average.toFixed(1),
|
||
// lineStyle: {
|
||
// color: 'red'
|
||
// }
|
||
// },]
|
||
//}
|
||
}],
|
||
|
||
}
|
||
chart.setOption(options)
|
||
window.addEventListener("resize", () => {
|
||
chart.resize()
|
||
})
|
||
},
|
||
}
|
||
}) |