echarts 非等间距刻度 柱状图

先来一张效果图

 关键逻辑:图片上的刻度间的高度差是等距的,但是可以对数据做一个映射,让刻度显示为映射后的值

上代码(以下为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;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值