echarts高端玩法

352 阅读2分钟

1.柱状图和饼图的图例联动

假设一个页面分别存在一个柱状图和一个饼图,抛开数据不看是否对应,两个图形有着相同个数和名称的图例,如下图所示:

image.png

我们可以开启图例事件的联动,即点击柱状图图例,同时显示或隐藏柱状图和饼图的图形;同理,点击饼图图例,同时显示或隐藏柱状图和饼图的图形。

下面我们来看具体实现代码

var myChart1 = echarts.init(获取的柱状图dom节点);
var myChart2 = echarts.init(获取的饼图dom节点);

// 此处省略渲染和自适应设置

// group属性用于联动,当两个图例拥有相同的group属性时即可
// 初始化将柱状图的group属性赋值
myChart1.group = "group1";

// 图例点击事件时开启联动
// 这里通过on方法监听legendselected事件(图例点击事件)
// 当点击任意一个图形的图例时触发点击事件,将饼图的group属性赋予柱状图相同的值,然后通过connect开启联动
// 实际上无论点击哪个图形的图例都会触发这两个事件,因为一旦点击便开启联动效果
// 这里在饼图图例点击事件方法下有一个定时函数,在调用完成之后取消联动效果
// 这里有一个疑点,无法直接取消联动效果,而是通过定时函数来取消,大胆猜测是因为echarts执行时为异步操作,所以添加setTimeout()将取消联动放在所有代码执行完成后再执行
myChart1.on("legendselectchanged", function (obj) {
  myChart2.group = "group1";
  echarts.connect("group1");
});
myChart2.on("legendselectchanged", function (obj) {
  myChart2.group = "group1";
  echarts.connect("group1");
  setTimeout(() => {
    myChart2.group = "";
    echarts.connect("");
  }, 1);
});

至于为什么要在点击后取消联动效果(没错,为了避免tooltip的联动效果),具体如下图:

image.png

2.横向柱状图

实现一个包含六条数据的排名,如下图所示:

image.png

废话不多说,直接上代码

<script>
import * as echarts from "echarts"
import ele from 'element-resize-detector'
export default {
  mounted() {
    this.drawChart3()
  },
  methods: {
    drawChart3(){
        let myChart = echarts.init(获取的横向柱状图dom节点)
        let options = {
            tooltip: {
                trigger: 'axis',
                axisPointer: {
                    type: 'shadow'
                },
                formatter: params => {
                    return params[0].value[0] + '<br/>' + params[0].marker +  '入驻面积: ' + this.formatNum(params[0].value[1]) + '㎡'
                },
                textStyle: {
                    align: 'left'
                }
            },
            grid: {
               top: 12,
               bottom: 6,
               left: 180,
               right: '6%'
            },
            xAxis: {
                type: 'value', // 核心参数,将x轴变成数值轴
                show: false,
                boundaryGap: true,
                inverse: true,
                axisLine: {
                    show: false,
                },
                axisTick: {
                    show: false
                },
                splitLine: {
                    show: false,
                },
                minInterval: 50
            },
            yAxis: {
                type: 'category', // 核心参数,将y轴变成类目轴
                inverse: true,
                axisLabel: {
                    inside: true,
                    color: '#fff',
                    verticalAlign: 'middle',
                    margin: -160,
                    formatter: (params, index) => {
                        if(params.length > 10) {
                            params = params.slice(0, 10) + '...'
                        }
                        if((index+1)==1){
                            return `{${index+1}|${index+1}} {fixed|${params}}`
                        }else if((index+1)==2){
                            return `{${index+1}|${index+1}} {fixed|${params}}`
                        }else if((index+1)==3){
                            return `{${index+1}|${index+1}} {fixed|${params}}`
                        }else {
                            return `{4|${index+1}} {fixed|${params}}`
                        }
                    },
                    rich: {
                        fixed: {
                            align: 'left'
                        },
                        1: {
                            align: 'center',
                            width: 15,
                            height: 15,
                            backgroundColor: 'rgb(248,180,19)',
                            color: 'rgb(28,33,82)',
                            borderRadius: 15,
                        },
                        2: {
                            align: 'center',
                            width: 15,
                            height: 15,
                            backgroundColor: 'rgb(226,225,235)',
                            color: 'rgb(28,33,82)',
                            borderRadius: 15,
                        },
                        3: {
                            align: 'center',
                            width: 15,
                            height: 15,
                            backgroundColor: 'rgb(241,112,31)',
                            color: 'rgb(28,33,82)',
                            borderRadius: 15,
                        },
                        4: {
                            align: 'center',
                            width: 15,
                            height: 15,
                            backgroundColor: 'rgb(204,203,204)',
                            color: 'rgb(28,33,82)',
                            borderRadius: 15,
                        }
                    }
                },
                axisLine: {
                    show: false
                },
                axisTick: {
                    show: false
                },
                splitLine: {
                    show: false
                }
            },
            dataset: {
                source: [
                    ['name', 'num'],
                    ['深圳市南山区腾讯大厦1', '666666'],
                    ['深圳市南山区腾讯大厦2', '555555'],
                    ['深圳市南山区腾讯大厦3', '444444'],
                    ['深圳市南山区腾讯大厦4', '333333'],
                    ['深圳市南山区腾讯大厦5', '222222'],
                    ['深圳市南山区腾讯大厦6', '111111'],
                ]
            },
            series: [
                {
                    type: 'bar',
                    color: 'rgb(0,153,255)',
                    barWidth: "4",
                    label: {
                        show: true,
                        position: 'insideBottomRight',
                        color: '#fff',
                        formatter: (value) => {
                            return this.formatNum(value.data[1])
                        }
                    },
                    encode: { // 核心参数,将dataset中的num值展示在x轴的纬度
                        x: 'num'
                    },
                    itemStyle: {
                        barBorderRadius: [34, 34, 34, 34]
                    }
                }
            ]
        }
        myChart.setOption(options)
        // 使用element-resize-detector插件自适应
        ele().listenTo(获取的横向柱状图dom节点, function(e) {
            myChart.resize();
        })
    },
    // 千分位显示
    formatNum(value) {
        if (!value && value !== 0) return 0;
        let str = value.toString();
        let reg =
            str.indexOf(".") > -1 ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g;
        return str.replace(reg, "$1,");
    }
  }
}
</script>