[英]How to display sum stack bar in echarts with legend handling
我需要在每列上方显示总计,并在显示或隐藏图例时重新计算总计。 这样做的最佳做法是什么?
前:
后:
在这个代码示例中,总数是通过echart生成的下方的条形计算的,我想要实现的是每次修改图例时都会重新计算下方条形的总数
let result = 0;
let array = [];
const series = [
{
name: 'Direct',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [320, 302, 301, 334, 390, 330, 320]
},
{
name: 'Mail total',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: 'Affiliate total',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [220, 182, 191, 234, 290, 330, 310]
},
{
name: 'Video total',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [150, 212, 201, 154, 190, 330, 410]
},
{
name: 'Search Engine',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [820, 832, 901, 934, 1290, 1330, 1320]
},
];
sum()
option = {
tooltip: {
trigger: 'axis',
axisPointer: {
// Use axis to trigger tooltip
type: 'shadow', // 'shtotalow' as default; can also be 'line' or 'shtotalow'
label:{
formatter: function (params){
for ( let i = 0; i < params.seriesData.length-1; i++){
result += params.seriesData[i].value
}
let resultFinal = params.value + " -------------------- total: " + result
result = 0;
return resultFinal;
}
}
}
},
legend: {
data: series.map(item => item.name),
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value'
},
yAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
series: [
{
name: 'Direct',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [320, 302, 301, 334, 390, 330, 320]
},
{
name: 'Mail total',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [120, 132, 101, 134, 90, 230, 210]
},
{
name: 'Affiliate total',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [220, 182, 191, 234, 290, 330, 310]
},
{
name: 'Video total',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [150, 212, 201, 154, 190, 330, 410]
},
{
name: 'Search Engine',
type: 'bar',
stack: 'total',
label: {
show: true
},
emphasis: {
focus: 'series'
},
data: [820, 832, 901, 934, 1290, 1330, 1320]
},
{
name: ' A total of ',
type: 'bar',
tooltip: {
show: false
},
stack: '',
color: '#FFFFFF',
label: {
normal: {
show: true,
position: 'right'
},
},
data: array,
z: -1,
barGap: '-100%',
}
]
};
function sum(){
for ( let z = 0; z < series[0].data.length; z++){
for( let i = 0; i < series.length; i++){
result += series[i].data[z];
}
array.push(result)
result = 0;
}
}
解决方案是通过使用'legendselectchanged'
事件来检测图例何时被单击/更改。 更改图例后,您可以重新计算结果数组,然后将这个新数组推送到图表中。
将以下代码添加到您提供的示例中,它将起作用。 ( 工作示例)
myChart.on('legendselectchanged', function (params) {
array.length = 0
for ( let z = 0; z < series[0].data.length; z++){
for( let i = 0; i < series.length; i++){
if(params.selected[series[i].name])
result += series[i].data[z];
}
array.push(result)
result = 0;
}
myChart.setOption(option);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.