Echarts

166 阅读3分钟

控制刻度线和标签对齐

yAxis: {
  type: 'category',
    data: usersName,
    axisLabel: {
    padding: [0, 0, 0, 10],
      formatter: function (value: string, index: number) {
      return value.split('(')[0];
    },
    //rotate: 45, // 旋转文字
  },
  axisTick: {
   alignWithLabel: true // 
    interval: 5 // 可以设置成 0 强制显示所有标签。如果设置为 1,表示『隔一个标签显示一个标签』,如果值为 2,表示隔两个标签显示一个标签,以此类推。
  }
},
tooltip: {
                trigger: 'axis',
                axisPointer: {
                    type: 'shadow', //鼠标悬浮到图上,可以出现标线和刻度文本。
                    crossStyle: {
                        color: '#999'
                    }
                }
            },
series: [
                {
                    name: 'PV量',
                    type: 'line', // 折线图
                    tooltip: {
                        valueFormatter: function (value) {
                            return `${(value as number)}`;
                        }
                    },
                    data: pvData,
                    itemStyle: {
                        normal: {
                            label: { show: true } // 折线图的每个折点都显示数值
                        }
                    }
                },
  ]

单x轴

import React from "react";
import ReactEcharts from 'echarts-for-react';


function getCharts(data) {
    if(!data.details||!data.details[0]){
        return;
    }
    if(Object.keys(data.details[0])==0){
        return
    }
    let xAxisData = data.details.map(item => {
        return item.product
    })
    let standardDatas = data.standardData&&data.standardData.map((item,index)=>{
        return {
            name:xAxisData[index],
            value:item
        };
    })
    let lineData=[{
        type: 'line',
        data: !data.standardData?[]:data.standardData,
        lineStyle:{
            color:'red',
            width: 1,
            opacity:0.3
        },
        itemStyle:{
            color:'red',
            opacity:0.3,
            width:0.5
        }
    }];
    let barData= !data.details[0] ? [] : Object.keys(data.details[0]).filter((item, index) => index !== 0).map((item) => {
        return {
            type: 'bar',
            label: {
                show: true, //开启显示
                position: 'top', //在上方显示
                textStyle: { //数值样式
                    color: '#000',
                    fontSize: Object.keys(data.details[0]).length>8?6:10
                },
                rich: {
                    red: {
                        color:'red',
                        fontSize: Object.keys(data.details[0]).length>8?6:10
                    },
                    green: {
                        color:'green',
                        fontSize: Object.keys(data.details[0]).length>8?6:10
                    }
                },
                formatter: (params) => {
                    let str = params.value[params.dimensionNames[params.encode.y[0]]];
                    if(data.standardData){
                        if(standardDatas.find(item=>item.name==params.name).value>str){
                            return `{red|${str}%}`
                        }else{
                            return `{green|${str}%}`;
                        }
                    }
                    if(data.standard&&Object.keys(data.details[0]).filter((item, index) => index !== 0).length==1){
                        if(data.standard>str){
                            return `{red|${str}%}`
                        }
                        if(data.standard<str){
                            return `{green|${str}%}`
                        }
                    }
                    if(data.standard&&Object.keys(data.details[0]).filter((item, index) => index !== 0).length>1){
                        if(data.title=='优良中差'||data.title=='已到达优良中差'){
                            if(data.standard>str&&params.seriesName=='优良率'){
                                return `{red|${str}%}`
                            }
                            if(data.standard<str&&params.seriesName=='优良率'){
                                return `{green|${str}%}`
                            }
                        }
                        return `${str}%`;
                    }
                    return `${str}%`
                },
            },
            markLine: {
                silent: true,
                symbol: ['none', 'none'],
                label: {
                    position: 'insideEndBottom',
                    formatter: (params) => {
                        return `${data.standard}%`
                    },
                },
                lineStyle: {
                    color: 'red',
                    width: 1,
                    type: 'solid',
                },
                data: !data.standard ? [] : [
                    {
                        yAxis: data.standard
                    },
                ],
            }
        }
    })
    let option = {
        title: {
            text: data.title,
            textStyle: {
                fontSize: 14,
            },
            x : 'center'
        },
        toolbox: {
            feature: {
                saveAsImage: {show: true}
            }
        },
        color: ['rgb(167,188,217)', 'rgb(187,208,237)', 'rgb(125,164,220)', 'rgb(69,121,204)', 'rgb(24,55,106)', 'rgb(24,30,106)', 'rgb(139,177,172)', 'rgb(87,208,237)', 'rgb(125,64,220)', 'rgb(169,121,204)', 'rgb(24,155,106)', 'rgb(124,30,106)', 'rgb(139,89,72)', 'rgb(187,242,237)', 'rgb(125,164,32)', 'rgb(25,64,32)'],
        legend: {
            bottom: 0,
            left: 'center'
        },
        grid: {
            left: "50px",
            right: "10px"
        },
        tooltip: {
            trigger: 'axis',
            backgroundColor: 'rgba(255,255,255,.8)',
            textStyle: {
                color: '#000',
                fontSize: 12
            },
            padding: 10,
            formatter: (params) => {
                let tip = `<p style="font-size: 16;font-weight: bold;">${params[0].name}</p>`;
                params.forEach(item=>{
                    tip += `${item.marker}${'line'==item.seriesType ? item.name : item.seriesName}${'line'==item.seriesType?(item.value):item.value[item.dimensionNames[item.encode.y[0]]]}%<br/>`
                })
                return tip
            }
        },
        dataset: {
            dimensions: Object.keys(data.details[0]),
            source: data.details
        },
        xAxis: [
            {
                type: 'category',
                data: xAxisData,
                axisTick: {
                    length: 0
                },
                axisLine: {
                    lineStyle: {
                        color: "rgb(219,219,219)"
                    }
                },
                axisLabel: {
                    color: "#000",
                    formatter: (params) => {
                        return params
                    }
                },
                axisPointer: {
                    type: 'shadow'
                }
            }
        ],
        yAxis: [
            {
                value: 'value',
                min: 0,
                max: 100,
                axisLine: {
                    show: false
                },
                axisTick: {
                    show: false
                },
                axisLabel: {
                    formatter: (value) => `${value}%`
                },
                splitLine: {
                    show: false
                }
            },

        ],
        series: lineData.concat(barData)
    };
    return (
        <ReactEcharts option={option} notMerge={true} style={{ height: "400px" }}></ReactEcharts>
    );
}
export default getCharts;

不均分双x轴

import React from "react";
import ReactEcharts from 'echarts-for-react';

function getSpecialDoublexCharts(data) {
    if(Object.keys(data).length==0){
        return;
    }
    let seriesData = data.typeName.map((item,i)=>{
        let arr = [];
        let length = data.typeName.length;
        switch(i){
            case 0:
                arr =data.data.filter((item,index)=>index%length==0);
                break;
            case 1:
                arr =data.data.filter((item,index)=>index%length==1);
                break;
            case 2:
                arr =data.data.filter((item,index)=>index%length==2);
                break;
            case 3:
                arr =data.data.filter((item,index)=>index%length==3);
                break;
        } 
        return {
            name: item,
            type: 'bar',
            data: data.typeName.length==1?data.data.map(element=>{
                if(typeof(element)=='string'){
                    return Number(element.substring(0,element.lastIndexOf('-')))
                }
                return element
            }):arr.map(element=>{
                if(typeof(element)=='string'){
                    return Number(element.substring(0,element.lastIndexOf('-')))
                }
                return element
            }),
            label: {
                show: true, //开启显示
                position: 'top', //在上方显示
                textStyle: { //数值样式
                    color: '#000',
                    fontSize: 8
                },
                rich: {
                    red: {
                        color:'red',
                        fontSize: 8
                    },
                    green: {
                        color:'green',
                        fontSize: 8
                    }
                },
                formatter: (params) => {
                    if(data.typeName.length==1){
                        if(typeof(data.data[params.dataIndex])=='string'){
                            return "↑"==data.data[params.dataIndex].substring(data.data[params.dataIndex].lastIndexOf('-')+1)?`{red|${Number(data.data[params.dataIndex].substring(0,data.data[params.dataIndex].lastIndexOf('-')))}}`:`{green|${Number(data.data[params.dataIndex].substring(0,data.data[params.dataIndex].lastIndexOf('-')))}}`
                        }
                        return `${params.value}`
                    }else{
                        if(typeof(arr[params.dataIndex])=='string'){
                            return "↑"==arr[params.dataIndex].substring(arr[params.dataIndex].lastIndexOf('-')+1)?`{red|${Number(arr[params.dataIndex].substring(0,arr[params.dataIndex].lastIndexOf('-')))}}`:`{green|${Number(arr[params.dataIndex].substring(0,arr[params.dataIndex].lastIndexOf('-')))}}`
                        }
                        return `${params.value}`
                    }
                },
            },
            xAxisIndex: 0,
            yAxisIndex: 0
        }
    });
    data.productsName.forEach((item) => {
        seriesData.push({
            data: [{
                name: item,
                value: 1
            }],
            label: {
                show: true,
                formatter: (params) => {
                    let str = '';
                    str=params.name.substring(0,params.name.lastIndexOf('-'));
                    return `${str.substring(0,str.indexOf('('))}\n${str.substring(str.indexOf('('))}`;
                },
                offset: [0, 30],
                textStyle: {
                    color: '#000',
                    fontSize: 10,
                },
            },
            itemStyle: {
                color: 'transparent',
                borderColor: 'rgb(219,219,219)',
                borderRightWidth: 1
            },
            type: 'bar',
            barGap: 0,
            barWidth: `${item.substring(item.lastIndexOf('-')+1)/data.caseName.length*100}%`,
            xAxisIndex: 1,
            yAxisIndex: 1
        })
    })
    let option = {
        title: {
            text: data.title,
            textStyle: {
                fontSize: 14,
            },
            x : 'center'
        },
        toolbox: {
            feature: {
                saveAsImage: {show: true}
            }
        },
        color: ['rgb(167,188,217)', 'rgb(187,208,237)', 'rgb(125,164,220)', 'rgb(69,121,204)', 'rgb(24,55,106)', 'rgb(24,30,106)', 'rgb(139,177,172)', 'rgb(87,208,237)', 'rgb(125,64,220)', 'rgb(169,121,204)', 'rgb(24,155,106)', 'rgb(124,30,106)', 'rgb(139,89,72)', 'rgb(187,242,237)', 'rgb(125,164,32)', 'rgb(25,64,32)']', 'rgb(69,121,204)'],
        legend: {
            show: data.typeName.length!==1,
            bottom: 10,
            left: 'center',
            data: data.typeName
        },
        grid: [{
            bottom: 160,
            left: "50px",
            right: "10px"
        }, {
            height: 100,
            bottom: 60,
            left: "50px",
            right: "10px"
        }],
        tooltip: {
            trigger: 'axis',
            backgroundColor: 'rgba(255,255,255,.8)',
            textStyle: {
                color: '#000',
                fontSize: 12
            },
            formatter: (params) => {
                let tip = '';
                    tip += params[0].name + '<br/>';
                    params && params.forEach(item => {
                        tip += item.marker + item.seriesName + ":" + `${item.value?item.value+'%':'ETA时长,暂不做对比'}`+ '<br/>'
                    })
                return tip;
            }
        },
        xAxis: [{
                type: 'category',
                data: data.caseName,
                axisTick: {
                    length: 0
                },
                axisLine: {
                    lineStyle: {
                        color: "rgb(219,219,219)"
                    }
                },
                axisLabel: {
                    color: "#000",
                    fontSize: 9,
                    rotate:90,
                    formatter: (params) => {
                        return params;
                    }
                },
                axisPointer: {
                    type: 'shadow'
                },
                zlevel: 2
            },
            {
                type: 'category',
                gridIndex: 1,
                axisLine: {
                    show: false
                },
                zlevel: 1
            },
        ],
        yAxis: [{
                value: 'value',
                min: 0,
                max: 100,
                axisLine: {
                    show: false
                },
                axisTick: {
                    show: false
                },
                axisLabel: {
                    formatter: (value) => `${value}%`
                },
                splitLine: {
                    show: false
                }
            },
            {
                type: 'value',
                gridIndex: 1,
                axisLabel: {
                    show: false
                },
                axisLine: {
                    show: false
                },
                splitLine: {
                    show: false
                },
                axisTick: {
                    show: false
                }
            }
        ],
        series: seriesData
    };
    return ( <ReactEcharts option = { option } notMerge={true} style = {{ height: "400px" }} > </ReactEcharts>
    );
}

export default getSpecialDoublexCharts;

三x轴

import React from "react";
import ReactEcharts from 'echarts-for-react';

function getSpecialThreeXCharts(data) {
    if (Object.keys(data).length == 0) {
        return;
    }
    let arr =  data.data.map(item=>item.split('-')[0]);
    let seriesData = [{
        type: 'bar',
        data: arr,
        label: {
            show: true, //开启显示
            position: 'top', //在上方显示
            textStyle: { //数值样式
                color: '#000',
                fontSize: arr.length>28?6:8
            },
            rich: {
                red: {
                    color:'red',
                    fontSize: arr.length>28?6:8
                },
                green: {
                    color: 'green',
                    fontSize: arr.length>28?6:8
                }
            },
            formatter: (params) => {
                let arr=data.data[params.dataIndex].split('-');
                return arr[1] ? isNaN(arr[1]) ? '↓'==arr[1].substring(0,1) ? `{red|${arr[1]}}\n${Number(arr[0])}%`: `{green|${arr[1]}}`  : `${Number(arr[0])}%` : ''
            },
        },
        xAxisIndex: 0,
        yAxisIndex: 0
    }];
    data.productsName.forEach((item, index) => {
        seriesData.push({
            data: [{
                name: item,
                value: 1
            }],
            label: {
                show: true,
                formatter: (params) => {
                    return params.name.substring(0,item.lastIndexOf('-'))
                },
                offset: [0, 50],
                textStyle: {
                    color: '#000',
                    fontSize: 16,
                },
            },
            itemStyle: {
                color: 'transparent',
                borderColor: 'rgb(219,219,219)',
                borderRightWidth: 1
            },
            type: 'bar',
            barGap: 0,
            barWidth: `${item.substring(item.lastIndexOf('-')+1)/data.typeName.length*100}%`,
            xAxisIndex: 2,
            yAxisIndex: 1
        })
    })
    let option = {
        title: {
            text: data.title,
            textStyle: {
                fontSize: 14,
            },
            x : 'center'
        },
        toolbox: {
            feature: {
                saveAsImage: {show: true}
            }
        },
        color: ['rgb(167,188,217)', 'rgb(187,208,237)', 'rgb(125,164,220)', 'rgb(69,121,204)', 'rgb(24,55,106)', 'rgb(24,30,106)', 'rgb(139,177,172)', 'rgb(87,208,237)', 'rgb(125,64,220)', 'rgb(169,121,204)', 'rgb(24,155,106)', 'rgb(124,30,106)', 'rgb(139,89,72)', 'rgb(187,242,237)', 'rgb(125,164,32)', 'rgb(25,64,32)'],
        grid: [{
            bottom: 200,
            left: "50px",
            right: "10px"
        }, {
            height: 150,
            bottom: 50,
            left: "50px",
            right: "10px"
        }],
        tooltip: {
            trigger: 'axis',
            backgroundColor: 'rgba(255,255,255,.8)',
            axisPointer: {
                type: 'none'
            },
            textStyle: {
                color: '#000',
                fontSize: 12
            },
            formatter: (params) => {
                return `${params[0].name.substring(0, params[0].name.length - 1)}:${params[0].value}%`;
            }
        },
        xAxis: [{
                type: 'category',
                data: data.caseName,
                axisTick: {
                    length: 0
                },
                axisLine: {
                    lineStyle: {
                        color: "rgb(219,219,219)"
                    }
                },
                axisLabel: {
                    color: "#000",
                    fontSize: 8,
                    rotate: 90,
                    formatter: (params) => {
                        return params;
                    }
                },
                axisPointer: {
                    type: 'shadow'
                },
                zlevel: 3
            },
            {
                type: 'category',
                data: data.typeName.map(item => {
                    return {
                        value: item,
                        textStyle: {
                            fontSize: 10,
                        }
                    }
                }),
                position: 'bottom',
                axisTick: {
                    length: 100,
                    lineStyle: {
                        color: "rgb(219,219,219)"
                    }
                },
                splitArea: {
                    show: false,
                },
                axisLine: {
                    show: false
                },
                axisLabel: {
                    color: "#000",
                    margin: 75,
                    interval:0,
                    formatter:(params)=>{
                        var str = ""; 
                            var num = 2; //每行显示字数 
                            var valLength = params.length; //该项x轴字数  
                            var rowNum = Math.ceil(valLength / num); // 行数  
                            
                            if(rowNum > 1) {
                                for(var i = 0; i < rowNum; i++) {
                                    var temp = "";
                                    var start = i * num;
                                    var end = start + num;
                                    
                                    temp = params.substring(start, end) + "\n";
                                    str += temp; 
                                }
                                return str;
                            } else {
                                return params;
                            } 
                    }
                },
                zlevel: 2
            },
            {
                type: 'category',
                gridIndex: 1,
                axisLine: {
                    show: false
                },
                zlevel: 1
            },
        ],
        yAxis: [{
                value: 'value',
                min: 0,
                max: 100,
                axisLine: {
                    show: false
                },
                axisTick: {
                    show: false
                },
                axisLabel: {
                    formatter: (value) => `${value}%`
                },
                splitLine: {
                    show: false
                }
            },
            {
                type: 'value',
                gridIndex: 1,
                axisLabel: {
                    show: false
                },
                axisLine: {
                    show: false
                },
                splitLine: {
                    show: false
                },
                axisTick: {
                    show: false
                }
            }
        ],
        series: seriesData
    };
    return ( < ReactEcharts option = { option } notMerge={true} style = { { height: "400px" } }> </ReactEcharts>
    );
}

export default getSpecialThreeXCharts;