echarts Y轴文字内容太长导致显示不全

方式一 :省略号

如上图这样一个横向的柱状图,y坐标轴的内容太长后会导致显示不全。因为数据是由后端传过来的,有些会很长有些会比较短。这个时候就需要用一些别的属性。

1.在grid中使用containLabel属性


containLabel 为 true 的时候:

grid.left grid.right grid.top grid.bottom grid.width grid.height 决定的是包括了坐标轴标签在内的所有内容所形成的矩形的位置。

这常用于『防止标签溢出』的场景,标签溢出指的是,标签长度动态变化时,可能会溢出容器或者覆盖其他组件。

  grid: {
    left: '4.5%',
    right: '2.5%',
    containLabel: true
  },

效果如下: 

但是调整grid的属性会导致短数据前的留白过于多,布局不合理 。

2.在yAxis中的axisLabel中加入overflow: 'truncate'

overflow: 'truncate'属性配置(将文字设置超出部分显示省略号)
文字超出宽度是否截断或者换行。配置width时有效 。

'truncate' 截断,并在末尾显示ellipsis配置的文本,默认为...
'break' 换行
'breakAll' 换行,跟'break'不同的是,在英语等拉丁文中,'breakAll'还会强制单词内换行

  yAxis: {
    show: true,
    type: 'category',
    axisLabel: {
      width: 75, //将内容的宽度固定
      overflow: 'truncate', //超出的部分截断
      ellipsis: '...' //截断的部分用...代替
    }
  },

效果如下: 

方式二 省略号+移入具体展示(用这个)

    function threeDot(str) {
        if (str.length <= 3) {
            return str;
        } else {
            var str1 = str.substring(0, 3);
            str1 += '...';
            return str1;
        }
    }
    option = {
        color: ['#20b1aa'],
        xAxis: {
            type: 'category',
            data: ['星期一 Monday', '星期二 Tuesday', '星期三 Wednesday', '星期四 Thursday', '星期五 Thursday', '星期六 Saturday', '星期日 Sunday'],
            triggerEvent: true,
            axisLabel: {
                interval: 0,
                rotate: 45,
                formatter: function(value) {
                    return threeDot(value)
                },
            }
        },
        yAxis: {
            type: 'value'
        },
        series: [{
            data: [120, 200, 150, 80, 70, 110, 90],
            type: 'bar',
            barWidth: 40
        }]
    };
    myChart.on("mouseover", function(event) {
        console.log(event.event.event.clientX)
        if (event.componentType === "xAxis") {
            $("<span class='title' style='position:fixed;border-radius:3px; padding:3px;background-color:#20b1aa;'></span>").appendTo($("body")).text(event.value).css({
                top: event.event.event.clientY,
                left: event.event.event.clientX + 20
            });
        }
    })
    myChart.on("mousemove", function(event) {
        if (event.componentType === "xAxis") {
            $(".title").css({
                top: event.event.event.clientY,
                left: event.event.event.clientX + 20
            });
        }
    })
    myChart.on("mouseout", function() {
        $(".title").remove();
    })

参考:X轴文本过长, 显示省略号, 并增加自定义title文本. - category-work,grid直角坐标,series-bar柱状图 - makeapie echarts社区图表可视化案例

3.优化y坐标上的数字 

如果在数据特别大的情况下,左边数据占得位置就会越来越宽,导致布局不好看,所以我们可以对这种数字进行处理一下

在yAxis的axisLabel属性中进行配置formatter

  • 第一种:

formatter(value) {
    var newValue = value;
    var k = 10000, sizes = ['', '万', '亿', '万亿'], i;
    if(value < k){
        newValue = value
        unit = ''
    }else{
        i = Math.floor(Math.log(value) / Math.log(k)); 
        newValue = ((value / Math.pow(k, i))).toFixed(2);
        unit = sizes[i];
    }
    return newValue + unit;
},
  • 第二种: 

        formatter(v) {
                    v = v.toString()
                    if (v >= 100000000000) {
                        return (v.substring(0, 5) / 10) + '亿'
                    } else if (v >= 10000000000) {
                        return (v.substring(0, 4) / 10) + '亿'
                    } else if (v >= 1000000000) {
                        return (v.substring(0, 3) / 10) + '亿'
                    } else if (v >= 100000000) {
                        return (v.substring(0, 2) / 10) + '亿'
                    } else if (v >= 10000000) {
                        return v.substring(0, 4) + '万'
                    } else if (v >= 1000000) {
                        return v.substring(0, 3) + '万'
                    } else if (v >= 100000) {
                        return v.substring(0, 2) + '万'
                    } else if (v >= 10000) {
                        return (v.substring(0, 2) / 10) + '万'
                    } else if (v >= 1000) {
                        return v
                    } else {
                        return v
                    }
                },

 yAxis.axisLabel. formatter 

        刻度标签的内容格式器,支持字符串模板和回调函数两种形式。

        示例:

// 使用字符串模板,模板变量为刻度默认标签 {value}
formatter: '{value} kg'
// 使用函数模板,函数参数分别为刻度数值(类目),刻度的索引
formatter: function (value, index) {
    return value + 'kg';
}

对于时间轴(type: 'time'),formatter 的字符串模板支持多种形式:

字符串模板:简单快速实现常用日期时间模板,string 类型
回调函数:自定义 formatter,可以用来实现复杂高级的格式,Function 类型
分级模板:为不同时间粒度的标签使用不同的 formatter,object 类型
 

下面我们分别介绍这三种形式。

字符串模板

使用字符串模板是一种方便实现常用日期时间格式化方式的形式。如果字符串模板可以实现你的效果,那我们优先推荐使用此方式;如果无法实现,再考虑其他两种更复杂的方式。支持的模板如下:

其他语言请参考相应语言包中的定义,语言包可以通过 echarts.registerLocale 注册。 

示例:

formatter: '{yyyy}-{MM}-{dd}' // 得到的 label 形如:'2020-12-02'
formatter: '{d}日' // 得到的 label 形如:'2日'

回调函数

回调函数可以根据刻度值返回不同的格式,如果有复杂的时间格式化需求,也可以引用第三方的日期时间相关的库(如 Moment.jsdate-fns 等),返回显示的文本。

示例:

// 使用函数模板,函数参数分别为刻度数值(类目),刻度的索引
formatter: function (value, index) {
    // 格式化成月/日,只在第一个刻度显示年份
    var date = new Date(value);
    var texts = [(date.getMonth() + 1), date.getDate()];
    if (index === 0) {
        texts.unshift(date.getFullYear());
    }
    return texts.join('/');
}

分级模板

有时候,我们希望对不同的时间粒度采用不同的格式化策略。例如,在季度图表中,我们可能希望对每个月的第一天显示月份,而其他日期显示日期。我们可以使用以下方式实现该效果:

示例:

formatter: {
    month: '{MMMM}', // 一月、二月、……
    day: '{d}日' // 1日、2日、……
}

支持的分级以及各自默认的取值为:

{
    year: '{yyyy}',
    month: '{MMM}',
    day: '{d}',
    hour: '{HH}:{mm}',
    minute: '{HH}:{mm}',
    second: '{HH}:{mm}:{ss}',
    millisecond: '{hh}:{mm}:{ss} {SSS}',
    none: '{yyyy}-{MM}-{dd} {hh}:{mm}:{ss} {SSS}'
}

以 day 为例,当一个刻度点的值的小时、分钟、秒、毫秒都为 0 时,将采用 day 的分级值作为模板。none 表示当其他规则都不适用时采用的模板,也就是带有毫秒值的刻度点的模板。

富文本

以上这三种形式的 formatter 都支持富文本,所以可以做成一些复杂的效果。

示例:

xAxis: {
    type: 'time',
    axisLabel: {
        formatter: {
            // 一年的第一个月显示年度信息和月份信息
            year: '{yearStyle|{yyyy}}\n{monthStyle|{MMM}}',
            month: '{monthStyle|{MMM}}'
        },
        rich: {
            yearStyle: {
                // 让年度信息更醒目
                color: '#000',
                fontWeight: 'bold'
            },
            monthStyle: {
                color: '#999'
            }
        }
    }
},

使用回调函数形式实现上面例子同样的效果:

示例:

xAxis: {
    type: 'time',
    axisLabel: {
        formatter: function (value) {
            const date = new Date(value);
            const yearStart = new Date(value);
            yearStart.setMonth(0);
            yearStart.setDate(1);
            yearStart.setHours(0);
            yearStart.setMinutes(0);
            yearStart.setSeconds(0);
            yearStart.setMilliseconds(0);
            // 判断一个刻度值知否为一年的开始
            if (date.getTime() === yearStart.getTime()) {
                return '{year|' + date.getFullYear() + '}\n'
                    + '{month|' + (date.getMonth() + 1) + '月}';
            }
            else {
                return '{month|' + (date.getMonth() + 1) + '月}'
            }
        },
        rich: {
            year: {
                color: '#000',
                fontWeight: 'bold'
            },
            month: {
                color: '#999'
            }
        }
    }
},

这样处理不会导致短数据前的留白过于多,左侧空隙过大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值