[JavaScript] 纯文本查看 复制代码
var titleStyle = {
fontSize: 14
};
var subjectsData = {
"yearMonth": "2018年1-7月",
"xData": [
"指标1",
"指标2",
"指标3",
"指标4",
"指标5",
"指标6",
"指标7",
"指标8",
"指标9",
"指标10",
"指标11",
"指标12",
"指标13",
"指标14",
"指标15",
"指标16"
],
"yData": [74756, -15424, -119416, 2558, 615, 7997, -15708, -29782, 2848, -7974, -5777, -7055, -4145, 13120, 6490, 4571]
}
var myJson = [];
var updata = [];
var downdata = [];
var auxdata = []; //辅助1的数据,存放每个堆子的总数
var auxdataDown = []; //支出的辅助数据,当堆子跨y轴的正负区域的时候做的辅助
var auxdataUp = []; //支出的辅助数据,当堆子跨y轴的正负区域的时候做的辅助
formatStackData(subjectsData, myJson, updata, downdata, auxdata, auxdataDown, auxdataUp)
option = {
title: {
text: subjectsData.yearMonth + '财务费用',
left: 'center',
textStyle: titleStyle
},
toolbox: {
feature: {
saveAsImage: {
show: true
}
}
},
tooltip: { //提示框组件
trigger: 'axis',
axisPointer: { // 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function(params) {
var tar;
var tar2;
if (params[3].value != '-') {
tar = params[3]; //收入
} else {
tar = params[4]; //支出
}
var str;
for (var i = 0; i < myJson.length; i++) {
if (tar.name === myJson[i].xData) {
str = Math.abs(tar.value) + Math.abs(myJson[i].auxdataDown) + Math.abs(myJson[i].auxdataUp);
}
}
return tar.name + '<br/>' + tar.seriesName + ' : ' + str;
}
},
legend: {
data: ['收入', '支出'],
selectedMode: false, //禁用点击图表改变显示状态
left: 10,
top: 18
},
grid: {
left: '1%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
splitLine: {
show: false
},
axisLabel: {
rotate: 40
},
data: subjectsData.xData
},
yAxis: {
type: 'value',
splitLine: {
show: false
}
},
series: [{
name: '辅助', //辅助1是总量数据,将主要柱状图按堆叠位置开始展示
type: 'bar',
stack: '总量',
itemStyle: {
normal: {
color: 'rgba(0,0,0,0)'
},
emphasis: {
show: false
}
},
data: auxdata
},
{
name: '支出辅助', //支出辅助是当支出跨越y轴的正负轴的时候做的辅助
type: 'bar',
stack: '总量',
itemStyle: {
normal: {
color: '#FF0033'
},
emphasis: {
show: false
}
},
data: auxdataDown
},
{
name: '收入辅助', //收入辅助是当收入跨越y轴的正负轴的时候做的辅助
type: 'bar',
stack: '总量',
itemStyle: {
normal: {
color: '#33CC33'
},
emphasis: {
show: false
}
},
data: auxdataUp
},
{
name: '收入',
type: 'bar',
stack: '总量',
itemStyle: {
normal: {
color: '#33CC33'
}
},
label: {
normal: {
show: true,
position: 'top',
formatter: function(params) {
return formatNormal(params, myJson);
}
}
},
data: updata
},
{
name: '支出',
type: 'bar',
stack: '总量',
itemStyle: {
normal: {
color: '#FF0033'
}
},
label: {
normal: {
show: true,
position: 'bottom',
formatter: function(params) {
return formatNormal(params, myJson);
}
}
},
data: downdata
}
]
};
//构造各个指标的数据
function formatStackData(subjectsData, myJson, updata, downdata, auxdata, auxdataDown, auxdataUp) {
var myData = subjectsData.yData;
var xData = subjectsData.xData;
var sum = 0;
for (var i = 0; i < myData.length; i++) {
var sign = sum + myData[i];
if (sign > 0) {
if (myData[i] > 0) {
if (sum < 0) {
//这种情况的时候柱子要从负数跨到正数,收入的时候会出现的情况,所以是收入辅助存放sum,其余辅助存放0
updata.push(sign);
auxdataUp.push(sum);
auxdataDown.push(0);
auxdata.push(0);
} else {
updata.push(myData[i]);
auxdataUp.push(0);
auxdataDown.push(0);
auxdata.push(sum);
}
downdata.push('-');
} else {
auxdata.push(sign);
updata.push('-');
downdata.push(Math.abs(myData[i]));
auxdataDown.push(0);
auxdataUp.push(0);
}
} else {
if (myData[i] > 0) {
auxdata.push(sign);
updata.push(-myData[i]);
downdata.push('-');
auxdataDown.push(0);
auxdataUp.push(0);
} else {
updata.push('-');
if (sum > 0) {
//这种情况的时候柱子要从正数跨到负数,支出数据的情况,所以这时候是支出辅助存放sum,其余辅助存放0
downdata.push(sign);
auxdataDown.push(sum);
auxdataUp.push(0);
auxdata.push(0);
} else {
downdata.push(myData[i]);
auxdataDown.push(0);
auxdataUp.push(0);
auxdata.push(sum);
}
}
}
sum = sum + myData[i];
//将各个分离的指标整理成json放入myJosn中
var a = {
xData: xData[i],
auxdata: auxdata[i],
auxdataUp: auxdataUp[i],
auxdataDown: auxdataDown[i],
updata: updata[i],
downdata: downdata[i]
};
myJson.push(a);
}
}
//控制数字显示的值
function formatNormal(params, myJson) {
var str;
for (var i = 0; i < myJson.length; i++) {
if (params.name === myJson[i].xData) {
str = Math.abs(params.value) + Math.abs(myJson[i].auxdataDown) + Math.abs(myJson[i].auxdataUp);
}
}
return str;
}