先来一张效果图
关键逻辑:图片上的刻度间的高度差是等距的,但是可以对数据做一个映射,让刻度显示为映射后的值
上代码(以下为angular的实现,包含关键逻辑,有删减并非完整代码):
@Component({
selector: 'app-finance-bar',
styleUrls: ['./finance-bar.scss'],
template: `
<div class="echart-container">
<div echarts [options]="options" class="echart"></div>
</div>
`,
})
export class FinanceEchartsBar {
options: any;
@Input('fianceData')
set fianceInfo(finance: any[]) {
if (finance && Array.isArray(finance) && finance.length > 0) {
this.options = this.getOptions(finance);
}
}
transformTo(data) {
/**在此函数内将数据data按一定的规则做映射**/
return r;
}
transformFrom(r) {
/**在此函数内将映射的数据做还原处理**/
return data;
}
getOptions(finance: any[]): void {
const me = this;
const seriesData = finance.map(it => {
return {
name: it.name,
type: 'bar',
barWidth: 20,
barGap: '0%',
// barCategoryGap: '65%',
data: it.data.map(d => this.transformTo(d))
};
}).reverse();
const legendData = finance.map(it => it.name).reverse();
const options = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
formatter: (e) => {
let content = '';
e.forEach(it => {
content += `${it.marker} ${it.seriesName}:${me.transformFrom(it.value)}<br/>`;
});
return `${e[0].name}<br/> ${content}`;
},
},
legend: {
show: true,
orient: 'vertical',
left: 'left',
top: 0,
selectedMode: false,
data: legendData
},
grid: {
left: '10%',
right: 70,
bottom: '2%',
top: '30',
containLabel: true
},
color: ['#1aa6fa', '#fec414', '#1bcc84'],
xAxis: [{
type: 'category',
data: ['资产总额', '负债总额', '营业总收入', '净利润', '纳税总额']
}],
yAxis: [{
type: 'value',
name: '万元(人民币)',
axisLine: {show: false},
axisTick: {show: false},
axisLabel: {
formatter: function (value) {
return me.transformFrom(value);
}
},
}],
series: seriesData
};
return options;
}
}