伊人久久大香线蕉综合影视_日韩精品少妇无码受不了_71pao成人国产永久免费视频_国产伦片中文免费观看_国产高清无码麻豆精品_九色综合伊人久久富二代_日韩黄色精品_日韩A∨精品日韩精品无码

echarts中關(guān)于自定義legend圖例文字

2021-8-16    前端達(dá)人

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

echarts中關(guān)于自定義legend圖例文字
首先看一張echarts餅圖: 
 
這張圖很好做,根本不值得提,但是用過echarts的可能會發(fā)現(xiàn)這個圖例有點不一樣,做這個圖例花了我好幾個小時去查,去試。結(jié)合一下echarts中l(wèi)egend圖例的特質(zhì)我們分析一下一些難點:

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



一個個看:

1.兩個變量
formatter有兩種形式: 
- 模板 
- 回調(diào)函數(shù)

模板

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

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

回調(diào)函數(shù)

使用回調(diào)函數(shù)
formatter: function (name) {
    return 'Legend ' + name;
}

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

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知用模板很難實現(xiàn)自定義name,所以只能用回調(diào)函數(shù)形式,采用富文本的形式對name進(jìn)行改造:

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.對齊,換行與居中
為了圖例與第一行文字對齊,需要設(shè)置兩個樣式的padding,把文字頂?shù)胶线m的位置,然后為了上下行的間隔,設(shè)置了第2行文字的行高,最終呈現(xiàn)了上面圖片的效果。不知道是不是有點地方做煩了,但是能最終實現(xiàn)自己想要的效果,很有成就感。

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/> : {c} (iiiii8i%)"
            },
            // 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;
    }

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

this.dateEchart.setOption({

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

             tooltip: {

trigger: 'item',

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

},

legend: {

orient: 'vertical',

right:'10%',

top:'40%',

data:['微信支付','支付寶網(wǎng)上支付','銀行支付'],

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

}

]

         });


藍(lán)藍(lán)設(shè)計建立了UI設(shè)計分享群,每天會分享國內(nèi)外的一些優(yōu)秀設(shè)計,如果有興趣的話,可以進(jìn)入一起成長學(xué)習(xí),請掃碼ben_lanlan,報下信息,會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務(wù)合作,也請與我們聯(lián)系。

文章來源:csdn

分享此文一切功德,皆悉回向給文章原作者及眾讀者.
免責(zé)聲明:藍(lán)藍(lán)設(shè)計尊重原作者,文章的版權(quán)歸原作者。如涉及版權(quán)問題,請及時與我們?nèi)〉寐?lián)系,我們立即更正或刪除。

藍(lán)藍(lán)設(shè)計cqzjtgb.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 平面設(shè)計服務(wù)

日歷

鏈接

個人資料

存檔

大石桥市| 沐川县| 越西县| 木兰县| 德惠市| 牟定县| 和静县| 麻江县| 东乡| 屯留县| 商水县| 方正县| 彰化市| 仙居县| 韶关市| 华池县| 宁乡县| 灵川县| 贵阳市| 邵阳县| 祁阳县| 云浮市| 沙坪坝区| 保山市| 岑溪市| 竹山县| 潍坊市| 沂南县| 简阳市| 武平县| 依安县| 托里县| 水城县| 银川市| 清远市| 永丰县| 山西省| 平凉市| 武汉市| 四平市| 谢通门县|