echart常用于web画图,官网上面有很多例子,具体查看:https://echarts.apache.org/examples/zh/index.html。今天介绍我在项目中用到的图–正太分布图。
一、定义画图数据模型
- xAxis里面定义了一个category类型的横坐标
- yAxis里面定义了两个value类型的纵坐标
- series里面定义了一个bar类型(柱状图)数据,一个line类型(正太分布曲线)数据
option = {
xAxis: {
type: 'category',
data: []
},
yAxis: [{
type: 'value',
splitNumber: 10,
max: max,
min: 0,
splitLine:{
show:false
}
},{
type: 'value',
splitNumber: 10,
max: maxLine,
min: 0,
splitLine:{
show:false
}
}],
series: [{
data: [],
type: 'bar',
barCategoryGap:1,
yAxisIndex: 0,
itemStyle: {
normal: {
label: {
show: true, //开启显示
position: 'top', //在上方显示
textStyle: { //数值样式
color: 'black',
fontSize: 16
}
}
}
}
},{
data: [],
type: 'line',
smooth:true,
yAxisIndex: 1
}]
};
二、定义正太分布计算函数getNormalData
参数说明:
- data:画图的横坐标,浮点数数组
- upper:画图数据的上限,浮点数
- lower:画图数据的下限,浮点数
- count:截距,表示分成多个给柱子,值越大,正太曲线越平滑
var xArr = [];
var yArr = [];
var yArrLine = [];
var mean = 0;
var stdev = 0;
var max = 0.0;
var maxLine = 0.0;
var low = 0;
var up = 0;
function getNormalData(data, upper, lower, count) {
var inter = (upper-lower)/(count-1);
console.log('inter=', inter);
var tmpxArr = [];
for (var i=0; i<count; i++) {
if (i == count-1) {
tmpxArr.push(upper);
} else {
tmpxArr.push(lower+i*inter);
}
}
console.log('tmpxArr=', tmpxArr);
var sum = 0.0;
for (var i=0; i<data.length; i++) {
sum += parseFloat(data[i]);
}
mean = sum/data.length;
var sumSqrt = 0.0;
for (var i=0; i<data.length; i++) {
sumSqrt += Math.pow(parseFloat(data[i])-mean, 2);
}
stdev = Math.sqrt(sumSqrt/(data.length-1));
low = mean - 3 * stdev;
up = mean + 3 * stdev;
for(var i=0; i<tmpxArr.length; i++){
if (tmpxArr[i] >= low && tmpxArr[i] <= up) {
xArr.push(tmpxArr[i]);
yArr.push(0);
}
}
for (var i=0; i<data.length; i++) {
for (var j=0; j<xArr.length; j++) {
if (j == 0) {
if (data[i] <= xArr[j]) {
yArr[j] = yArr[j] + 1;
}
} else {
if (xArr[j-1] <= data[i] && data[i] < xArr[j]) {
yArr[j] = yArr[j] + 1;
}
}
}
}
for(var j=0; j<xArr.length; j++){
var res = fun(xArr[j],mean,stdev).toFixed(2);
yArrLine.push(res);
}
max = yArr[0];
maxLine = yArrLine[0];
for(var i=0; i<yArr.length; i++){
if (max < yArr[i]) {
max = yArr[i];
}
if (maxLine < yArrLine[i]) {
maxLine = yArrLine[i];
}
}
}
function fun (x,u,a){
return (1 / Math.sqrt(2 * Math.PI) * a) * Math.exp( -1 * ((x-u) * (x-u)) / (2 * a * a));
}
三、构造画图数据
var spk_1_upper = 35.4;
var spk_1_lower = 0;
var W1_data = ["22.91","23.52","24.55","25.08","28.23","23.57","24.87","25.06","26.67","25.72","26.56","26.15","26.78","24.94","29.32","24.81","28.73","26.98","26.26","28.19","26.29","26.16","28.39","26.50","24.40","24.52","25.74","27.99","28.82","24.67","24.56","23.77","25.13","27.97","25.93","30.18","25.93","24.43","26.63","25.76","26.93","24.24","26.99","24.41","25.35","26.42","29.95","27.27","25.94","24.65","25.35","23.92","25.99","25.07","25.27","26.87","27.42","24.87","26.44","26.15","23.70","27.61","28.06","26.14","24.76","24.88","24.97","25.80","26.55","26.79","25.46","26.47","28.05","25.15","26.15","26.04","22.88","29.06","27.48","24.46","26.32","24.96","26.14","26.97","24.09","25.38","25.63","24.97","28.11","25.55","25.57","25.38","24.76","26.71","25.29","25.53","24.25","24.16","27.02","27.40","22.63","29.40","26.81","25.25","24.82","26.92","25.69","24.48","24.29","24.48","26.50","24.92","29.48","26.04","25.82","24.75","28.34","25.61","24.37","26.99","26.74","23.54","24.04","22.08","24.14","27.72","26.10","26.55","25.62","27.17","26.38","25.81","25.62","24.67","26.30","25.05","26.21","24.08","24.27","23.73","27.28","26.49","26.00","27.80","27.80","25.93","24.40","27.82","26.19","26.27","26.69","25.45","22.73","26.16","32.10","25.89","24.66","25.76","25.85","27.10","26.11","28.26","26.01","26.01","24.89","26.34","23.16","25.74","26.91","27.19","25.85","27.76","26.64","26.33","26.27","25.95","24.70","27.70","26.43","25.45","24.52","27.77","23.01","26.76","25.85","26.90","25.81","26.43","26.25","27.87","27.79","25.79","24.59","24.43","23.29","24.53","25.41","28.51","26.51","25.93"];
四、定义画图页面和函数
<html style="height: 100%">
<head>
<meta charset="utf-8">
</head>
<body style="height: 100%; margin: 0">
<div id="container" style="height: 100%"></div>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-gl/echarts-gl.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-stat/ecStat.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/dataTool.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/world.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/bmap.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/simplex.js"></script>
<script type="text/javascript">
if (option && typeof option === "object") {
option['xAxis']['data'] = xArr;
option['series'][0]['data'] = yArr;
option['series'][1]['data'] = yArrLine;
myChart.setOption(option, true);
}
</script>
</body>
</html>
效果图如下:
五、完整代码如下:
<!DOCTYPE html>
<html style="height: 100%">
<head>
<meta charset="utf-8">
</head>
<body style="height: 100%; margin: 0">
<div id="container" style="height: 100%"></div>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-gl/echarts-gl.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-stat/ecStat.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/dataTool.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/world.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/bmap.min.js"></script>
<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/simplex.js"></script>
<script type="text/javascript">
var spk_1_upper = 35.4;
var spk_1_lower = 0;
var W1_data = ["22.91","23.52","24.55","25.08","28.23","23.57","24.87","25.06","26.67","25.72","26.56","26.15","26.78","24.94","29.32","24.81","28.73","26.98","26.26","28.19","26.29","26.16","28.39","26.50","24.40","24.52","25.74","27.99","28.82","24.67","24.56","23.77","25.13","27.97","25.93","30.18","25.93","24.43","26.63","25.76","26.93","24.24","26.99","24.41","25.35","26.42","29.95","27.27","25.94","24.65","25.35","23.92","25.99","25.07","25.27","26.87","27.42","24.87","26.44","26.15","23.70","27.61","28.06","26.14","24.76","24.88","24.97","25.80","26.55","26.79","25.46","26.47","28.05","25.15","26.15","26.04","22.88","29.06","27.48","24.46","26.32","24.96","26.14","26.97","24.09","25.38","25.63","24.97","28.11","25.55","25.57","25.38","24.76","26.71","25.29","25.53","24.25","24.16","27.02","27.40","22.63","29.40","26.81","25.25","24.82","26.92","25.69","24.48","24.29","24.48","26.50","24.92","29.48","26.04","25.82","24.75","28.34","25.61","24.37","26.99","26.74","23.54","24.04","22.08","24.14","27.72","26.10","26.55","25.62","27.17","26.38","25.81","25.62","24.67","26.30","25.05","26.21","24.08","24.27","23.73","27.28","26.49","26.00","27.80","27.80","25.93","24.40","27.82","26.19","26.27","26.69","25.45","22.73","26.16","32.10","25.89","24.66","25.76","25.85","27.10","26.11","28.26","26.01","26.01","24.89","26.34","23.16","25.74","26.91","27.19","25.85","27.76","26.64","26.33","26.27","25.95","24.70","27.70","26.43","25.45","24.52","27.77","23.01","26.76","25.85","26.90","25.81","26.43","26.25","27.87","27.79","25.79","24.59","24.43","23.29","24.53","25.41","28.51","26.51","25.93"];
var xArr = [];
var yArr = [];
var yArrLine = [];
var mean = 0;
var stdev = 0;
var max = 0.0;
var maxLine = 0.0;
var low = 0;
var up = 0;
function getNormalData(data, upper, lower, count) {
var inter = (upper-lower)/(count-1);
console.log('inter=', inter);
var tmpxArr = [];
for (var i=0; i<count; i++) {
if (i == count-1) {
tmpxArr.push(upper);
} else {
tmpxArr.push(lower+i*inter);
}
}
console.log('tmpxArr=', tmpxArr);
var sum = 0.0;
for (var i=0; i<data.length; i++) {
sum += parseFloat(data[i]);
}
mean = sum/data.length;
var sumSqrt = 0.0;
for (var i=0; i<data.length; i++) {
sumSqrt += Math.pow(parseFloat(data[i])-mean, 2);
}
stdev = Math.sqrt(sumSqrt/(data.length-1));
low = mean - 3 * stdev;
up = mean + 3 * stdev;
for(var i=0; i<tmpxArr.length; i++){
if (tmpxArr[i] >= low && tmpxArr[i] <= up) {
xArr.push(tmpxArr[i]);
yArr.push(0);
}
}
for (var i=0; i<data.length; i++) {
for (var j=0; j<xArr.length; j++) {
if (j == 0) {
if (data[i] <= xArr[j]) {
yArr[j] = yArr[j] + 1;
}
} else {
if (xArr[j-1] <= data[i] && data[i] < xArr[j]) {
yArr[j] = yArr[j] + 1;
}
}
}
}
for(var j=0; j<xArr.length; j++){
var res = fun(xArr[j],mean,stdev).toFixed(2);
yArrLine.push(res);
}
max = yArr[0];
maxLine = yArrLine[0];
for(var i=0; i<yArr.length; i++){
if (max < yArr[i]) {
max = yArr[i];
}
if (maxLine < yArrLine[i]) {
maxLine = yArrLine[i];
}
}
}
function fun (x,u,a){
return (1 / Math.sqrt(2 * Math.PI) * a) * Math.exp( -1 * ((x-u) * (x-u)) / (2 * a * a));
}
getNormalData(W1_data, spk_1_upper, spk_1_lower, 100);
console.log('low=', low);
console.log('up=', up);
console.log('max=', max);
console.log('maxLine=', maxLine);
console.log('mean=', mean);
console.log('stdev=', stdev);
console.log('xArr=', xArr);
console.log('yArr=', yArr);
console.log('yArrLine=', yArrLine);
var dom = document.getElementById("container");
var myChart = echarts.init(dom);
var app = {};
option = null;
option = {
xAxis: {
type: 'category',
data: []
},
yAxis: [{
type: 'value',
splitNumber: 10,
max: max,
min: 0,
splitLine:{
show:false
}
},{
type: 'value',
splitNumber: 10,
max: maxLine,
min: 0,
splitLine:{
show:false
}
}],
series: [{
data: [],
type: 'bar',
barCategoryGap:1,
yAxisIndex: 0,
itemStyle: {
normal: {
label: {
show: true, //开启显示
position: 'top', //在上方显示
textStyle: { //数值样式
color: 'black',
fontSize: 16
}
}
}
}
},{
data: [],
type: 'line',
smooth:true,
yAxisIndex: 1
}]
};
;
if (option && typeof option === "object") {
option['xAxis']['data'] = xArr;
option['series'][0]['data'] = yArr;
option['series'][1]['data'] = yArrLine;
myChart.setOption(option, true);
}
</script>
</body>
</html>