配置项如下
var data = [
{ name: "Mon_1", time: "Mon", tdCount: 820, ydCount: 810, cost: 0.2, count: 800 },
{ name: "Tue_1", time: "Tue", tdCount: 932, ydCount: 800, cost: 0.3, count: 850 },
{ name: "Wed_1", time: "Wed", tdCount: 901, ydCount: 880, cost: 0.4, count: 900 },
{ name: "Thu_1", time: "Thu", tdCount: 934, ydCount: 900, cost: 0.1, count: 950 },
{ name: "Fri_1", time: "Fri", tdCount: 1290, ydCount: 1200, cost: 0.2, count: 1000 },
{ name: "Sat_1", time: "Sat", tdCount: 1330, ydCount: 1400, cost: 0.6, count: 1050 },
{ name: "Sun_1", time: "Sun", tdCount: 1320, ydCount: 1410, cost: 0.7, count: 1100 },
];
//1-one 2-two 3-three 4-four 5-five 6-six 7-seven 8-eight 9-nine 10-ten
var conf = {
type: "bar",//图表类型: line,bar/ybar,pie,radar,bar3D,Candlestick
typeNum: "1",// 图类型编号:line:1~6,bar:1~3,pie:1~4,radar:1~4,bar3D:1~2;[更改数据展示:曲线_柱状图(数据堆叠,以百分比显示;曲线_平滑显示),饼图(圆环,玫瑰图等)]
layoutNum: "1",//图表布局编号:line/bar:1~7,pie:1~4,radar:1~4,bar3D:1~4;[更改位置:标题位置,图例位置,表格,坐标轴名称]
styleNum: "1",//图表样式编号:1~4;[更改颜色]
xkey: "time",//x轴的数据key,[pie图,xkey值为ykey值名称,可无]
ykey: ["tdCount", "ydCount"],//y轴数据key,[pie图,ykey只能有一个且为数值]
textObj: {//更改:标题,系列名
title: "", //标题名
seriesNm: { tdCount: "", ydCount: "" }//系列名[line:key根据ykey确定;pie系列名不可修改]
}
}
var option = getEchartOpt(data, conf);
function getEchartOpt(data, conf) {
var sType = conf.type;//图类型
var typeNum = conf.typeNum;//类型编号
var layoutNum = conf.layoutNum;//布局编号
var styleNum = conf.styleNum;//样式编号
var xkey = conf.xkey;//x轴key
var ykey = conf.ykey;//y轴key
var xType = conf.xType || 'category';//x轴数据类型:category,time,value;或者通过data判断得出(isNum,new Time()?)
var textObj = conf.textObj;//标题名,系列名
//数据渲染
var series = getSeries(sType, data, xkey, ykey);
console.log("series", series);
var opt = getOptTpl(sType, data, xType);
//类型编号:opt-series
setTypeNum(sType, typeNum, opt, series);
//布局编号:opt-series
setLayoutNum(sType, layoutNum, opt, series);
//样式编号:opt
setStyleNum(sType, styleNum, opt);
//标题名,系列名等修改
setTextNm(sType, textObj, opt, series);
//数据合并
opt.series = series;
console.log("opt", opt);
return opt;
}
//获取option模版
function getOptTpl(sType, data, xType) {
if (sType === "line" || sType === "bar") {
var option = {
title: {
text: '图表标题',
},
legend: {
},
dataset: {
source: data
},
series: [],
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
xAxis: {
type: xType,
axisLine: {
lineStyle: {
color: '#999',
}
}
},
yAxis: {
type: 'value',
axisLine: {
lineStyle: {
color: '#999',
}
},
splitLine: {}
}
};
} else if (sType === "ybar") {
var option = {
title: {
text: '图表标题',
},
legend: {
},
dataset: {
source: data
},
series: [],
tooltip: {
trigger: 'item'
},
yAxis: {
type: xType,
axisLine: {
lineStyle: {
color: '#999',
}
}
},
xAxis: {
type: 'value',
axisLine: {
lineStyle: {
color: '#999',
}
},
splitLine: {}
}
};
} else if (sType === "pie") {
var option = {
title: {
text: '图表标题',
},
legend: {
},
dataset: {
source: data
},
series: [],
tooltip: {
trigger: 'item'
}
}
} else if (sType === "radar") {
var option = {
title: {
text: '图表标题'
},
tooltip: {},
legend: {},
radar: {
// shape: 'circle',
indicator: []
},
series: []
}
} else if (sType === "bar3D") {
var option = {
title: { text: "图表标题" },
tooltip: {},
legend: {},
xAxis3D: {
type: xType,
axisLine: {
lineStyle: {
color: '#999',
}
}
},
yAxis3D: {
name: "",//默认Y,不显示
type: 'category',
axisLine: {
lineStyle: {
color: '#999',
}
}
},
zAxis3D: {
type: 'value',
},
grid3D: {
},
series: [{
type: 'bar3D',
// stack: "堆叠",
data: [["a", "", 1], ["b", "", 2], ["c", "", 3]]
}, {
type: 'bar3D',
// stack: "堆叠",//堆叠
data: [["a", "", 2], ["b", "", 3], ["c", "", 4]]
}]
}
}
return option;
}
//获取series:添加nameKey
function getSeries(sType, data, xkey, ykey) {
var allSeries = [];
if (sType === "line" || sType === "bar") {
//多个系列
for (var i = 0; i < ykey.length; i++) {
var yField = ykey[i];
allSeries.push({
name: yField,//'系列名'
extraYkey: yField,//匹配需要修改的系列名
type: sType,
label: {},
encode: { x: xkey, y: yField }//dataset,数据映射
});
}
} else if (sType === "ybar") {
//多个系列
for (var i = 0; i < ykey.length; i++) {
var yField = ykey[i];
allSeries.push({
name: yField,//'系列名'
extraYkey: yField,//匹配需要修改的系列名
type: "bar",
label: {},
//数据反过来映射
encode: { x: yField, y: xkey }//dataset,数据映射
});
}
} else if (sType === "pie") {
var yField = ykey[0];//只取第一个
var defSeries = {
name: '',
type: 'pie',
radius: '65%',
center: ['50%', '50%'],
encode: { value: yField, itemName: xkey }
}
allSeries.push(defSeries);
} else if (sType === "radar") {
var defSeries = {
type: "radar",
data: []
};
// 获取雷达指示器名称
var nameObj = {};
for (var i = 0; i < ykey.length; i++) {
var yField = ykey[i];
var dataObj = ({
name: yField,//'系列名'
extraYkey: yField,//匹配需要修改的系列名
value: []
});
for (var j = 0; j < data.length; j++) {
var dataRow = data[j];
var yval = dataRow[yField] || 0;//y轴,无数据,赋默认值0
var name = dataRow[xkey];
dataObj.value.push(yval);
//指示器的最大值
if (nameObj[name] == undefined) {
nameObj[name] = 0;
}
if (nameObj[name] < yval) {
nameObj[name] = yval;
}
}
defSeries.data.push(dataObj);
}
//雷达图的指示器,max*1.1倍
var indicator = [];
for (var nm in nameObj) {
indicator.push({ name: nm, max: Number(nameObj[nm] * 1.1) })
}
defSeries.indicator = indicator;
allSeries.push(defSeries);
} else if (sType === "bar3D") {
// bar3D的series.data在setTypeNum时生成
for (var i = 0; i < ykey.length; i++) {
var yField = ykey[i];
var defSeries = {
name: yField,//'系列名'
extraYkey: yField,//匹配需要修改的系列名
extraXkey: xkey,
type: 'bar3D',
label: {},
data: []
}
allSeries.push(defSeries);
}
}
return allSeries;
}
//类型编号:series[sobj.stack,sobj.smooth];opt[tooltip.trigger]
function setTypeNum(sType, typeNum, opt, series) {
if (sType === "line") {
// 1:数据实际效果展示,2:堆叠,3:面积;
// 456对应123的基础上,曲线变成_平滑显示
if (typeNum === "2") {
series.forEach(function (sobj) {
sobj.stack = "堆叠";//多个系列,x轴相同,y数据值叠加后显示;只有一个系列,类型编号无意义
});
} else if (typeNum === "3") {
series.forEach(function (sobj) {
sobj.areaStyle = {};//面积:区域填充样式
});
} else if (typeNum === "4") {
series.forEach(function (sobj) {
sobj.smooth = true;
});
} else if (typeNum === "5") {
series.forEach(function (sobj) {
sobj.stack = "堆叠";//多个系列,数据值叠加后显示
sobj.smooth = true;
});
} else if (typeNum === "6") {
series.forEach(function (sobj) {
sobj.areaStyle = {};//面积
sobj.smooth = true;
});
}
//百分比:一个系列:基准线100%,无意义;两个系列:系列1每个点/系列2每个点;只有一个系列,类型编号无意义
} else if (sType === "bar"||sType==="ybar") {
//柱状图修改tip类型
opt.tooltip.trigger = "item";
// 1:数据实际效果展示,2:堆叠,3:条形图_横向展示(xy互换);
if (typeNum === "2") {
series.forEach(function (sobj) {
sobj.stack = "堆叠";//多个系列,x轴相同,y数据值叠加后显示;只有一个系列,类型编号无意义
});
}
} else if (sType === "pie") {
// 1:扇形面积:展现数据的大小
// 2:圆环展示_圆环面积展示数据大小
// 3:扇区圆心角展现数据的百分比,半径展现数据的大小。roseType:'radius'
// 4:所有扇区圆心角相同,仅通过半径展现数据大小。'area'
if (typeNum === "2") {
//https://gallery.echartsjs.com/editor.html?c=xG61SsUMJi
series.forEach(function (sobj) {
sobj.radius = ['25%', '70%'];
});
} else if (typeNum === "3") {
series.forEach(function (sobj) {
sobj.roseType = 'radius';
});
} else if (typeNum === "4") {
series.forEach(function (sobj) {
sobj.roseType = 'area';
});
}
} else if (sType === "radar") {
//指示器
opt.radar.indicator = series[0].indicator;
delete series[0].indicator;
//1:默认:绘制类型_多角形
//2:面积:区域填充样式
//3:节点放大,正方形展示;
//4:绘制类型:圆形,移除分割线
if (typeNum === "2") {
series.forEach(function (sobj) {
sobj.areaStyle = {};
});
} else if (typeNum === "3") {
series.forEach(function (sobj) {
sobj.symbol = "rect";
sobj.symbolSize = 10;
});
} else if (typeNum === "4") {
opt.radar.splitLine = { show: false };
opt.radar.shape = 'circle' //支持 'polygon' 和 'circle'
}
} else if (sType === "bar3D") {
// 1:默认正常3D状态
// 2:堆叠显示:tootip提示y:"",z是每一项数据,无总和
if (typeNum === "1") {
series.forEach(function (sobj) {
var yField = sobj.extraYkey;
var xkey = sobj.extraXkey;
for (var j = 0; j < data.length; j++) {
var dataRow = data[j];
var yval = dataRow[yField] || 0;//无数据,赋默认值0
var name = dataRow[xkey];
sobj.data.push([name, yField, yval]);
}
})
} else if (typeNum === "2") {
series.forEach(function (sobj) {
sobj.stack = "堆叠";
var yField = sobj.extraYkey;
var xkey = sobj.extraXkey;
for (var j = 0; j < data.length; j++) {
var dataRow = data[j];
var yval = dataRow[yField]||0;
var name = dataRow[xkey];
sobj.data.push([name, "", yval]);//y轴相同
}
})
} else if (typeNum === "3") { }
}
}
//布局编号:opt[title.left/top/show,legend,yAxis];series[sobj.label]
function setLayoutNum(sType, layoutNum, opt, series) {
if (sType === "line" || sType === "bar" || sType === "ybar") {
//1默认:title:top-0,left-0;legend:top-0,left-center;顶左-顶中
if (layoutNum === "2") {//顶中-右中_垂直 1
// opt.title.top = "";
opt.title.left = "center";
opt.legend.right = "0";
opt.legend.top = "center";
opt.legend.orient = "vertical";//horizontal,vertical
} else if (layoutNum === "3") {//顶中-顶(下)中-y无 2
opt.title.left = "center";
opt.legend.top = "6%";//title下
opt.legend.left = "center";
opt.yAxis.show = false;
} else if (layoutNum === "4") {//顶中-底中-y_轴线无 3
opt.title.left = "center";
opt.legend.bottom = "0";
opt.legend.left = "center";
opt.yAxis.axisLine.show = false;
} else if (layoutNum === "5") {//无-底中-y_分割线无 4
opt.title.left = "center";
opt.legend.bottom = "0";
opt.legend.left = "center";
opt.yAxis.splitLine.show = false;
//跳过excel布局:表格5,6,7
} else if (layoutNum === "6") {//无-底中-y无-折线_值标注 8
opt.title.show = false;
opt.legend.bottom = "0";
opt.legend.left = "center";
opt.yAxis.show = false;
series.forEach(function (sobj) {
sobj.label = {
show: true
}
});
} else if (layoutNum === "7") {//无-无-xy无 11
opt.title.show = false;
opt.legend.show = false;
opt.xAxis.show = false;
opt.yAxis.show = false;
}
} else if (sType === "pie" || sType === "radar") {
if (layoutNum === "2") {//顶中-右中_垂直
opt.title.left = "center";
opt.legend.right = "0";
opt.legend.top = "center";
opt.legend.orient = "vertical";//horizontal,vertical
} else if (layoutNum === "3") {//顶中-顶(下)中
opt.title.left = "center";
opt.legend.top = "6%";//title下
opt.legend.left = "center";
} else if (layoutNum === "4") {//中中-中中
opt.title.x = 'center';
opt.title.y = 'center';
}
} else if (sType === "bar3D") {
if (layoutNum === "2") {//顶中-右中_垂直
opt.title.left = "center";
opt.legend.right = "0";
opt.legend.top = "center";
opt.legend.orient = "vertical";//horizontal,vertical
} else if (layoutNum === "3") {//顶中-顶(下)中
opt.title.left = "center";
opt.legend.top = "6%";//title下
opt.legend.left = "center";
} else if (layoutNum === "4"){
series.forEach(function (sobj) {
sobj.label = {
show: true
}
});
}
}
}
//样式编号:opt[color]
function setStyleNum(sType, styleNum, opt) {
// if (sType === "line" || sType === "bar" || sType === "pie" || sType === "ybar" || sType === "radar") {
var styleObj = {// 颜色模版
//0,echart默认的
"1": ["#f845f1", "#ad46f3", "#5045f6", "#4777f5", "#44aff0", "#45dbf7", "#f6d54a", "#f69846", "#ff4343"],
"2": ['#afa3f5', '#00d488', '#3feed4', '#3bafff', '#f1bb4c', "red", "blue"],
"3": ['#eb2100', '#d0570e', '#d0a00e', '#34da62', '#00e9db', '#00c0e9', '#0096f3', '#33CCFF', '#33FFCC', '#eb3600'],
"4": ["#8d7fec", "#5085f2", "#e75fc3", "#f87be2", "#f2719a", "#fca4bb", "#f59a8f", "#fdb301", "#57e7ec", "#cf9ef1", "#57e7ec", "#cf9ef1"],
}
// } else if (sType === "radar") {
// }
var styleTpl = styleObj[styleNum];
if (styleTpl != undefined) {
opt.color = styleTpl;
}
}
//文本名修改:opt[title.text];series[sobj.name]
function setTextNm(sType, textObj, opt, series) {
//对象合并:assign_谷歌45+
// var textObj=Object.assign({ title: "", seriesNm: {} }, textObj);
if (isObject(textObj) == false) {
return false;
}
//修改标题
var title = textObj.title;
if (isNonEmptyStr(title)) {
opt.title.text = title;
}
//修改系列名
if (sType === "line" || sType === "bar" || sType === "ybar" || sType === "bar3D") {//pie未处理
var seriesNm = textObj.seriesNm || {};
for (k in seriesNm) {
var name = seriesNm[k];
if (isNonEmptyStr(name)) {
//break
series.forEach(function (sobj) {
if (sobj.extraYkey === k) {
sobj.name = name;
}
});
}
}
}
}
function isNonEmptyStr(str) {
return typeof str === "string" && str.length > 0;
}
//判断是否是对象
function isObject(pm) {
return Object.prototype.toString.call(pm) === "[object Object]";
}
/*
//dataset方式:key值为null,"",但不能没有key
//tooltip写在series里>option里
//提取
var fnTpl = function (sobj) {
sobj.stack = "堆叠";//多个系列,数据值叠加后显示
}
series.forEach(fnTpl)
//标注点/线:最大值/最小值,指定值?
markPoint: {
data: [
{type: 'max', name: '最大值'}
],
animationDelay: 2000,
animationDuration: 1000
},
// areaStyle: {},//区域填充样式
//颜色来源
https://gallery.echartsjs.com/editor.html?c=xHkjKKrz_M
"#f845f1","#ad46f3","#5045f6","#4777f5","#44aff0","#45dbf7","#f6d54a","#f69846","#ff4343"
https://gallery.echartsjs.com/editor.html?c=xG61SsUMJi
var colorList=['#afa3f5', '#00d488', '#3feed4', '#3bafff', '#f1bb4c'];
https://gallery.echartsjs.com/editor.html?c=xhmv-1o6XS
var myColor = ['#eb2100', '#eb3600', '#d0570e', '#d0a00e', '#34da62', '#00e9db', '#00c0e9', '#0096f3', '#33CCFF', '#33FFCC'];
https://gallery.echartsjs.com/editor.html?c=xbMIK6kQkR
"#8d7fec","#5085f2","#e75fc3","#f87be2","#f2719a","#fca4bb","#f59a8f","#fdb301","#57e7ec","#cf9ef1","#57e7ec","#cf9ef1"
// 第1 first 1st,第2 second 2nd,第3 third 3rd,第4 fourth 4th,第5 fifth 5th,
// 第6 sixth 6th,第7 seventh 7th,第8 eighth 8th,第9 ninth 9th,第10 tenth 10th,
*/