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

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

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

日歷

鏈接

個人資料

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

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
97avcom| 成人国产亚洲精品a区天堂华泰| 在线成人激情黄色| 久久久在线视频| 欧美日韩999| 欧美午夜电影在线| 久久亚洲综合国产精品99麻豆精品福利| 亚洲免费电影一区| 欧美日本精品在线| 中文字幕在线精品| 日韩中文字幕亚洲| 久久伊人免费视频| 日韩视频中文字幕| 欧美亚洲视频一区二区| 97福利一区二区| 亚洲国产精品视频在线观看| 亚洲影院高清在线| 日韩中文字幕在线播放| 亚洲精品久久久久久久久| 国产日韩欧美91| 中文字幕亚洲综合| 97精品国产97久久久久久春色| 97精品视频在线| 日韩成人黄色av| 亚洲aⅴ男人的天堂在线观看| 亚洲国产中文字幕久久网| 日韩在线小视频| 日韩成人xxxx| 国内精品伊人久久| 亚洲国产高清自拍| www.日韩不卡电影av| 亚洲精品视频网上网址在线观看| 欧美日韩精品中文字幕| 日韩小视频在线观看| 国产欧美一区二区三区久久| 中文字幕在线国产精品| 日韩欧亚中文在线| 日韩精品免费看| 九九热99久久久国产盗摄| 亚洲奶大毛多的老太婆| 成人在线播放av| 日本一欧美一欧美一亚洲视频| 久久久久久免费精品| 精品久久香蕉国产线看观看gif| 国产日韩欧美夫妻视频在线观看| 日日摸夜夜添一区| 中国日韩欧美久久久久久久久| 亚洲国产精品va在线| 国产精品美女www爽爽爽视频| 国产成人精品日本亚洲专区61| 亚洲精品免费一区二区三区| 最新中文字幕亚洲| 国产91网红主播在线观看| 精品国偷自产在线视频| 91po在线观看91精品国产性色| 亚洲女人天堂av| 国产精品igao视频| 日韩av电影手机在线观看| 亚洲全黄一级网站| 国产精品自拍小视频| 亚洲视频视频在线| 九九热这里只有在线精品视| 中文字幕久久精品| 午夜精品一区二区三区在线视| 成人欧美一区二区三区在线| 中文字幕精品一区久久久久| 欧美精品999| 亚洲在线视频观看| 亚洲激情视频网站| 98精品国产高清在线xxxx天堂| 亚洲图片欧洲图片av| 欧美精品videosex性欧美| 欧美日韩加勒比精品一区| 欧美专区中文字幕| 亚洲乱码国产乱码精品精| 久久精品国产精品亚洲| 午夜精品久久久久久99热| 久久久久久久香蕉网| 亚洲成人国产精品| 亚洲欧美国产日韩中文字幕| 欧美高清理论片| 日韩在线观看网址| 久久全球大尺度高清视频| 2020久久国产精品| 欧美激情亚洲激情| 欧美日韩国产精品| 美女少妇精品视频| 97国产真实伦对白精彩视频8| 亚洲色图综合网| 亚洲欧美制服综合另类| 亚洲成人久久电影| 国产精品日韩欧美综合| 欧美性生活大片免费观看网址| 亚洲精品国产精品自产a区红杏吧| 日韩av大片免费看| 性日韩欧美在线视频| 97碰在线观看| 97精品一区二区视频在线观看| 欧美激情欧美狂野欧美精品| 久久色在线播放| 久久亚洲精品毛片| 77777少妇光屁股久久一区| 中文字幕日韩在线观看| 欧美激情在线狂野欧美精品| 国产精品欧美激情| 国产欧美精品va在线观看| 亚洲一区二区三区久久| 欧美中文字幕在线视频| 精品国产1区2区| 久久久久北条麻妃免费看| 国产一区二区三区在线看| 91精品久久久久久综合乱菊| 日韩精品免费看| 欧美视频免费在线| 亚洲xxxx3d| 国产精品自产拍高潮在线观看| 亚洲一区www| 97在线精品视频| xxav国产精品美女主播| 成人久久久久爱| 久久人人爽人人爽人人片亚洲| 乱亲女秽乱长久久久| 91精品国产综合久久久久久蜜臀| 亚洲性猛交xxxxwww| 国产精品久久久久不卡| 国产日本欧美一区二区三区| 精品国内产的精品视频在线观看| 97热精品视频官网| 国产精品入口夜色视频大尺度| 国产+成+人+亚洲欧洲| 欧美大成色www永久网站婷| 国产精品最新在线观看| 久久91精品国产91久久跳| 欧美影院成年免费版| 91高潮精品免费porn| 91精品久久久久久久久中文字幕| 日韩av影视综合网| www国产精品com| 久久久久久综合网天天| 日本sm极度另类视频| 欧美日韩精品中文字幕| 欧美日韩激情美女| 久久久电影免费观看完整版| 久久天天躁狠狠躁夜夜爽蜜月| 日本韩国在线不卡| 欧美丝袜美女中出在线| 午夜精品一区二区三区在线| 成人黄色av免费在线观看| 国产美女久久久| 日本高清+成人网在线观看| 欧美午夜精品久久久久久人妖| 亚洲激情中文字幕| 欧美亚洲另类激情另类| 欧美精品久久一区二区| 亚洲国产精品高清久久久| 亚洲黄色片网站| 国产综合视频在线观看| 91高清视频在线免费观看| 日韩视频在线免费| 国产精品一二三视频| 久久91亚洲精品中文字幕奶水| 热99精品只有里视频精品| 中文字幕亚洲一区| 色爱精品视频一区|