92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

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/> : {c} (weyoow2%)"
            },
            // 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/>: {c} (0a4mgck%)"

},

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

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

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

日歷

鏈接

個人資料

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

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
亚洲国产清纯| 国产一区二区三区站长工具| 欧美国产精品v| jvid一区二区三区| 国产精品国产三级国产aⅴ中文| 91在线观看欧美日韩| 国产精品日产欧美久久久久| 一本大道久久a久久精品综合| 成人ar影院免费观看视频| 亚洲永久精品大片| 国产一区二区不卡视频在线观看| 免费看欧美女人艹b| 伊人在我在线看导航| 欧美国产视频在线| 一本色道69色精品综合久久| 国产区在线看| 亚洲成人a级网| 97国产精品免费视频| 亚洲理论在线a中文字幕| 欧美日韩在线一区二区| 国产精品家庭影院| 91精品国产欧美一区二区成人| 一本一本久久| 中文字幕 久热精品 视频在线| 国产欧美一区二区三区在线| 男人的j进女人的j一区| 99精品一区| 国产成人午夜片在线观看高清观看| 蜜臀a∨国产成人精品| 在线观看精品国产视频| 91最新在线免费观看| 亚洲在线国产日韩欧美| 2024短剧网剧在线观看| 清纯唯美亚洲经典中文字幕| 欧美一区二区性放荡片| 日韩av大片站长工具| 欧美色女视频| 国产成人精品免费看| 日韩一区二区三区四区| 国产精品免费看| 中文字幕成人在线| 精品在线视频一区二区| 日韩av电影免费观看高清| av电影在线播放高清免费观看| 久久久久久久久久久一区| 欧美网站一区二区| 黄色成人在线网址| 日韩视频永久免费观看| eeuss鲁片一区二区三区| 91精品国产综合久久婷婷香蕉| 福利小视频在线| av不卡在线观看| 96久久精品| 国产毛片在线看| 欧美日韩成人在线播放| 成人羞羞国产免费| 欧美视频在线免费| 香蕉久久a毛片| 日韩成人精品一区| 亚洲午夜成aⅴ人片| 福利一区二区| 亚洲品质视频自拍网| 欧美激情在线观看视频| 国产亚洲精品久久久| 久久综合免费视频| 图片区小说区区亚洲影院| 影音先锋男人资源在线| 狠狠综合久久av一区二区蜜桃| 国产精品一区电影| 黄色亚洲网站| 亚洲高清免费视频| abab456成人免费网址| 日韩欧美成人一区| 欧美一区二区人人喊爽| 日韩成人网免费视频| 欧美中日韩免费视频| 丁香花在线电影小说观看| 久久电影网站中文字幕| 欧美偷拍一区二区| 欧美日韩伦理一区二区| 久久中文久久字幕| 一区二区三区 在线观看视频| 免费成人直播| 99国产成+人+综合+亚洲欧美| 欧美日韩精品三区| 偷拍自拍一区| 黄色在线播放网站| 97精品国产97久久久久久免费| 国产探花在线精品一区二区| 亚洲精品电影在线观看| 天天综合亚洲| 欧美一级电影久久| 日韩精品美女| 日韩成人中文电影| 国产日韩精品一区二区三区在线| 日韩电影免费观看高清完整版| 青青草国产精品亚洲专区无| 国产精品福利在线观看网址| 色综合影院在线观看| 精品国产凹凸成av人导航| 欧美综合77777色婷婷| 日韩美女视频在线观看| 日韩一区二区在线免费观看| 国产日产欧美一区二区视频| 亚洲欧美在线第一页| 电影k8一区二区三区久久| 欧美国产亚洲视频| 中文字幕免费高清电视剧网站在线观看| 欧美xxxx少妇| 久久嫩草精品久久久久| 欧美一区二区三区喷汁尤物| 日韩专区在线播放| 北岛玲heyzo一区二区| 国产精品专区第二| 欧美情侣在线播放| 第九色区aⅴ天堂久久香| 欧美亚洲丝袜| 午夜精品成人av| www日韩tube| 欧美日韩黄色一区二区| 国产毛片精品视频| 亚洲欧美偷拍另类a∨色屁股| 成人精品一区二区三区免费| 欧洲美女日日| 午夜精品久久久久久不卡8050| 国产成人精品免高潮在线观看| 欧美日韩一二三四| 欧美午夜美女看片| 成人春色激情网| 91久久精品无嫩草影院| 亚洲自拍偷拍网| а√中文在线天堂精品| 久久精品不卡| 亚洲自拍偷拍欧美| av一区二区三区四区电影| 亚洲电影一区| 中文字幕精品—区二区四季| 波多野结衣的一区二区三区| 中文字幕日韩在线观看| xfplay精品久久| 国产一区二区黑人欧美xxxx| 国产精品三区www17con| 国产成人精品免费看| 制服丝袜中文字幕一区| 99在线视频精品| 91一区二区三区在线| 99re66热这里只有精品8| 国产亚洲一区二区精品| 亚洲情趣在线观看| 亚洲第一搞黄网站| 99久久久国产精品美女| se69色成人网wwwsex| 99se视频在线观看| 成人高清免费在线| 日产精品99久久久久久| 日本一区影院| 亚洲精品v日韩精品| 伊人免费在线| 美日韩一级片在线观看| 欧美午夜电影网| 欧美日韩福利在线观看| 成人黄视频在线观看| 99久久这里只有精品| 久久精品国产v日韩v亚洲|