<strike id="cy2gs"><menu id="cy2gs"></menu></strike>
  • <del id="cy2gs"><dfn id="cy2gs"></dfn></del>
  • echarts中關于自定義legend圖例文字

    2021-8-16    前端達人

    文章摘自:https://blog.csdn.net/YPJMFC/article/details/78979319,非常感謝大牛分享。

    echarts中關于自定義legend圖例文字
    首先看一張echarts餅圖: 
     
    這張圖很好做,根本不值得提,但是用過echarts的可能會發現這個圖例有點不一樣,做這個圖例花了我好幾個小時去查,去試。結合一下echarts中legend圖例的特質我們分析一下一些難點:

    1.這里的圖例文本包含兩個變量,而formatter提供的變量模板只有name
    2.兩個變量的樣式各不相同
    3.對齊,換行與居中的應用



    一個個看:

    1.兩個變量
    formatter有兩種形式: 
    - 模板 
    - 回調函數

    模板

    使用字符串模板,模板變量為圖例名稱 {name}
    formatter: 'Legend {name}'

    這種想要修改name的值,暫時我做不到,歡迎讀者指正

    回調函數

    使用回調函數
    formatter: function (name) {
        return 'Legend ' + name;
    }

    我們在返回時可以對name進行修改,從而返回我們需要的值,初步改動是這樣:

    var data = [
        {value:40, name:'貨幣'},
        {value:20, name:'股票'},
        {value:40, name:'債券'}
    ]
    formatter:  function(name){
        var total = 0;
        var target;
        for (var i = 0, l = data.length; i < l; i++) {
        total += data[i].value;
        if (data[i].name == name) {
            target = data[i].value;
            }
        }
        return name + ' ' + ((target/total)*100).toFixed(2) + '%';
    }


    2.兩種樣式
    想自定義圖例文字樣式,就要用到富文本:rich,但是在官方文檔中看到的只有模板形式的富文本樣式配置,由1知用模板很難實現自定義name,所以只能用回調函數形式,采用富文本的形式對name進行改造:

    formatter:  function(name){
        var total = 0;
        var target;
        for (var i = 0, l = data.length; i < l; i++) {
        total += data[i].value;
        if (data[i].name == name) {
            target = data[i].value;
            }
        }
        var arr = [
            '{a|'+((target/total)*100).toFixed(2)+'%}',
            '{b|'+name+'}',
        ]
        return arr.join('\n')
    },
    textStyle:{
        rich:{
            a:{
                fontSize:20,
                verticalAlign:'top',
                align:'center',
                padding:[0,0,28,0]
            },
            b:{
                fontSize:14,
                align:'center',
                padding:[0,10,0,0],
                lineHeight:25
            }
        }
    }

    3.對齊,換行與居中
    為了圖例與第一行文字對齊,需要設置兩個樣式的padding,把文字頂到合適的位置,然后為了上下行的間隔,設置了第2行文字的行高,最終呈現了上面圖片的效果。不知道是不是有點地方做煩了,但是能最終實現自己想要的效果,很有成就感。

    4.實例
    這是完整的組件:

    class ConfigChart extends Component {

        constructor(props) {
            super(props);
            this.state = {};
        };
        getOption = () => {
            var data = [
                {value:40, name:'貨幣'},
                {value:20, name:'股票'},
                {value:40, name:'債券'}
            ]
            const option = {
                tooltip : {
                    trigger: 'item',
                    formatter: "{a} <br/>{b} : {c} (7bd5vxx%)"
                },
                // formatter:  function(name){

                //     var total = 0;
                //     var target;
                //     for (var i = 0, l = data.length; i < l; i++) {
                //     total += data[i].value;
                //     if (data[i].name == name) {
                //     target = data[i].value;
                //     }
                //     }
                //     return name + ' ' + ((target/total)*100).toFixed(2) + '%';
                // },

                series: [
                    {
                        name: '訪問來源',
                        type: 'pie',
                        radius: [50, 80],
                        center: ['50%', '40%'],
                        label: {
                            normal: {
                                show: false
                            },
                            emphasis: {
                                show: false
                            }
                        },
                        data: [
                            {
                                value: 40,
                                name: '貨幣',
                                itemStyle: { normal: { color: "#5877F0" } }
                            },
                            { value: 20, name: '股票', itemStyle: { normal: { color: "#AA9FFD" } } },
                            { value: 40, name: '債券', itemStyle: { normal: { color: "#F96481" } } }
                        ]
                    }
                ],
                legend: {
                    x: 'center',
                    // y: 'bottom',
                    bottom:5,
                    itemGap:30,
                    itemWidth:5,
                    textStyle:{
                        fontSize: 12
                    },
                    align:'left',
                    data: [
                        {
                            name:'貨幣',
                            icon:'circle'
                        },
                        {
                            name:'股票',
                            icon:'circle'
                        },{
                            name:'債券',
                            icon:'circle'
                        }
                    ],
                    // formatter:'{a|{name}}\n{name}',
                    formatter:  function(name){
                        var total = 0;
                        var target;
                        for (var i = 0, l = data.length; i < l; i++) {
                        total += data[i].value;
                        if (data[i].name == name) {
                            target = data[i].value;
                            }
                        }
                        var arr = [
                            '{a|'+((target/total)*100).toFixed(2)+'%}',
                            '{b|'+name+'}',
                        ]
                        // return name + ' ' + ((target/total)*100).toFixed(2) + '%';
                        return arr.join('\n')
                    },
                    textStyle:{
                        rich:{
                            a:{
                                fontSize:20,
                                verticalAlign:'top',
                                align:'center',
                                padding:[0,0,28,0]
                            },
                            b:{
                                fontSize:14,
                                align:'center',
                                padding:[0,10,0,0],
                                lineHeight:25
                            }
                        }
                    }
                },
                backgroundColor: "#fff"
            };
            return option;
        };
        render() {
            const _this = this;
            const { isShow } = this.props;
            return isShow ?
                <div className={StyleClass.configChartWrapper}>
                    <ReactEcharts
                        option={_this.getOption()}
                        echarts={echarts}
                        style={{ height: '265px', width: $.width() }}
                        className='react_for_echarts' />
                </div> : null;
        }

    }
    其實大神上面的數據還是有點問題,按照大神這樣做的話,餅狀圖的百分比和算出來的有一點點出入(算出來的值加起來不夠百分百),其實就是最后一項的百分比和餅狀圖的不一樣,其他的都一樣,所以,我自己修改了幾個小時,終于把它完善了(主要是綠色的代碼),代碼如下:

    this.dateEchart.setOption({

    color:['#4BC373','#4178E8','#FF5B57'],

                 tooltip: {

    trigger: 'item',

    formatter: "{a} <br/>{b}: {c} (l755r5p%)"

    },

    legend: {

    orient: 'vertical',

    right:'10%',

    top:'40%',

    data:['微信支付','支付寶網上支付','銀行支付'],

    formatter:(name)=>{

    let target,count;

    let total=0,num=0;

    let l=this.data2.length;

    for(var i=0;i<l;i++){

    total+=this.data2[i].value;

    }

    for(i=0;i<l;i++){

    if((this.data2[i].name==name)&&(i<l-1)){

    target=this.data2[i].value;

    count=((target/total)*100).toFixed(2)+'%';

    return name+': '+count;

    }

    if((this.data2[i].name==name)&&(i==l-1)){

    for(i=0;i<l-1;i++){

    num+=parseFloat((((this.data2[i].value)/total)*100).toFixed(2));

    }

    let yy=(100-num).toFixed(2);

    return name+': '+yy+'%';

    }

    }

    }

    },

    series: [

    {

    name:'訪問來源',

    type:'pie',

    radius: ['40%', '60%'],

    center:['40%','50%'],

    avoidLabelOverlap: false,

    label: {

    normal: {

    show: false,

    position: 'center'

    },

    emphasis: {

    show: true,

    textStyle: {

    fontSize: '30',

    fontWeight: 'bold'

    }

    },

    },

    labelLine: {

    normal: {

    show: false

    }

    },

    data:this.data2

    }

    ]

             });


    藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

    文章來源:csdn

    分享此文一切功德,皆悉回向給文章原作者及眾讀者.
    免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

    藍藍設計www.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

    日歷

    鏈接

    個人資料

    藍藍設計的小編 http://www.skdbbs.com

    存檔

    主站蜘蛛池模板: 亚洲av无码成人精品区在线播放 | 亚洲精品私拍国产福利在线| 精品乱子伦一区二区三区高清免费播放 | 亚洲国产精品碰碰| 久久99精品国产| 久久99精品久久久久久久久久| 精品一区二区无码AV| 久久久国产精品福利免费| 久久er99热精品一区二区| 亚洲AV无码成人精品区狼人影院 | 久久精品国产免费一区| 国精无码欧精品亚洲一区| 中文精品人人永久免费| 欧美精品在线免费| 精品久久久久久久久久中文字幕 | 精品永久久福利一区二区 | 99热精品久久只有精品| 91麻豆精品国产自产在线观看亚洲| 亚洲午夜福利精品无码| 久久中文精品无码中文字幕| 99热亚洲精品6码| 日本人精品video黑人| 国产精品一区在线播放| 国产精品免费观看调教网| 日韩精品久久无码中文字幕| 亚洲精品无码成人片久久| 亚洲精品国产综合久久一线| 日韩精品在线播放| 麻豆精品视频在线观看| 欧美激情精品久久久久久久| 久久久这里有精品中文字幕| 好湿好大硬得深一点动态图91精品福利一区二区 | 94久久国产乱子伦精品免费| 久久国产精品99久久久久久老狼 | 国产一精品一av一免费爽爽| 国产成人精品白浆久久69| 精品人人妻人人澡人人爽人人| 中文字幕精品久久久久人妻| 青青草原精品国产亚洲av| 精品无码日韩一区二区三区不卡 | 一区二区三区精品|