【高级课程笔记】—— Echarts高级应用(二)

一、视觉映射

 

注:visualMap 以前叫dataRange,如果你看到了比较老的教程或博客,里面有dataRange,要知道那就是视觉映射 visualMap

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>视觉映射</title>
    <style>
        #main{
            margin: 20px;
            width: 800px;
            height: 500px;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    // 基于准备好的dom,初始化echarts实例
    const myChart = echarts.init(document.getElementById('main'));

    //数据源
    const source = [
       //x   y   z   w
        [2,  1, 10, 90],
        [4,  2, 20, 80],
        [6,  3, 30, 70],
        [8,  4, 40, 60],
        [10, 5, 50, 50],
        [12, 6, 60, 40],
        [14, 7, 70, 30],
        [16, 8, 80, 20],
        [18, 9, 90, 10],
    ];

    //颜色范围
    const color=['#70ad47', '#c00000'];

    // 指定图表的配置项和数据
    const option = {
        tooltip: {},
        /*绘图区*/
        grid:{
            left:100
        },
        /*x 轴*/
        xAxis: {},
        /*y 轴*/
        yAxis: {},
        /*数据集*/
        dataset:{source},
        /*
        * visualMap 视觉映射 {}
        *   type 映射方式
        *       continuous 连续型
        *       piecewise 分段型
        *   min 映射区间的起始位置,如0
        *   max 映射区间的结束位置,如90
        *   range [] 显示此范围内的项目(在连续型中有效),百分百类型,如[0,100]
        *   calculable 是否显示拖拽用的手柄
        *   inRange 自定义映射范围
        *       color[] 颜色映射
        *       symbolSize[] 大小映射
        *
        * */
        visualMap:{
            type:'continuous',
            // type:'piecewise',
            min:0,
            max:100,
            range:[0,90],
            calculable: true,
            inRange:{
                color,
                symbolSize:[10,60],
            },
            // dimension:2,
            dimension:3
        },

        /*系列列表*/
        series: [
            {
                name: '视觉映射',
                type: 'scatter',
                encode:{
                    tooltip:[0,1,2]
                }
            },
        ]
    };


    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);
</script>
</body>
</html>

 

二、事件

ECharts 如何监听事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件</title>
    <style>
        #main{
            margin: 20px;
            width: 700px;
            height: 500px;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    // 基于准备好的dom,初始化echarts实例
    const myChart = echarts.init(document.getElementById('main'));

    // 指定图表的配置项和数据
    const option = {
        xAxis: {
            data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
        },
        yAxis: {},
        series: [{
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
        }]
    };
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);

    /*
    * 使用on 方法绑定click点击事件
    * */
    myChart.on('click',function(param){
        console.log(param)
    })


</script>
</body>
</html>

  

鼠标事件有哪些

组件交互事件的监听

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件</title>
    <style>
        #main{
            margin: 20px;
            width: 700px;
            height: 500px;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    // 基于准备好的dom,初始化echarts实例
    const myChart = echarts.init(document.getElementById('main'));

    // 指定图表的配置项和数据
    const option = {
        legend:{
            data:['销量','库存']
        },
        xAxis: {
            data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
        },
        yAxis: {},
        series: [{
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
        },{
            name: '库存',
            type: 'bar',
            data: [3, 4, 8, 3, 7, 5]
        }]
    };
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);


    /*
    * 使用on 方法绑定legendselectchanged 图例开关点击事件
    * */
    myChart.on('legendselectchanged',function(param){
        console.log(param)
    })

</script>
</body>
</html>

 代码触发 ECharts 中组件的行为

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件</title>
    <style>
        #main{
            margin: 20px;
            width: 700px;
            height: 500px;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    // 基于准备好的dom,初始化echarts实例
    const myChart = echarts.init(document.getElementById('main'));

    // 指定图表的配置项和数据
    const option = {
        title: {
            text: '饼图程序调用高亮示例',
            left: 'center'
        },
        tooltip: {
            trigger: 'item',
            formatter: '{a} <br/>{b} : {c} ({d}%)'
        },
        legend: {
            orient: 'vertical',
            left: 'left',
            data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
        },
        series: {
            name: '访问来源',
            type: 'pie',
            radius: '55%',
            center: ['50%', '60%'],
            data: [
                {value: 335, name: '直接访问'},
                {value: 310, name: '邮件营销'},
                {value: 234, name: '联盟广告'},
                {value: 135, name: '视频广告'},
                {value: 1548, name: '搜索引擎'}
            ],
            /*鼠标划上的状态*/
            emphasis: {
                itemStyle: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowOffsetY: 10,
                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                }
            }
        }
    };
    // 使用刚指定的配置项和数据显示图表。
    myChart.setOption(option);

    /*当前索引*/
    let ind=0;

    /*获取系列数据的长度*/
    let len =5;

    /*使用dispatchAction 方法高亮并提示一个扇形
    *   type 触发的行为类型
    *       highlight 高亮
    *       showTip 显示提示
    *       downplay 取消高亮
    *       hideTip 取消提示
    *   seriesIndex 系列索引,用于寻找系列列表中的某个系列
    *   dataIndex 数据所有,用于寻找系列中的某个元素
    * */
    myChart.dispatchAction({
        type:'highlight',
        seriesIndex:0,
        dataIndex:ind
    });
    myChart.dispatchAction({
        type:'showTip',
        seriesIndex:0,
        dataIndex:ind
    });





    /*建立时间监听器*/
    setInterval(function(){
        myChart.dispatchAction({
            type:'hideTip',
            seriesIndex:0,
            dataIndex:ind
        });
        myChart.dispatchAction({
            type:'downplay',
            seriesIndex:0,
            dataIndex:ind
        });

        ind++;
        if(ind===len){ind=0}
        myChart.dispatchAction({
            type:'highlight',
            seriesIndex:0,
            dataIndex:ind
        });
        myChart.dispatchAction({
            type:'showTip',
            seriesIndex:0,
            dataIndex:ind
        });

    },1000)


</script>
</body>
</html>

 

三、富文本标签

富文本标签,就是内容丰富的文本标签。

在许多地方(如图、轴的标签等)都可以使用富文本标签。例如:

文本块和文本片段

  • 文本块(Text Block):文本标签块整体。
  • 文本片段(Text fragment):文本标签块中的部分文本

文本标签的属性可以参考label:https://www.echartsjs.com/zh/option.html#series-bar.label

富文本的属性:https://www.echartsjs.com/zh/option.html#series-bar.label.rich.%3Cstyle_name%3E

富文本的实现步骤

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>富文本</title>
    <style>
        #main{
            margin: 20px;
            width: 700px;
            height: 500px;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    // 基于准备好的dom,初始化echarts实例
    const myChart = echarts.init(document.getElementById('main'));

    // 数据
    const data=[
        {name:'杨戬',value:80,img:'./images/yj.jpg'},
        {name:'鲁班',value:60,img:'./images/lb.jpg'},
        {name:'沈梦溪',value:40,img:'./images/smx.jpg'},
        {name:'诸葛亮',value:30,img:'./images/zgl.jpg'}
    ];

    //获取hero的数据
    let hero=data[0];

    /*自定义标签 label
    *   formatter 文本块
    *       '{样式名|文字内容}\n 换行'
    *   文本块的样式
    *       textBorderColor 文本描边颜色
    *       textBorderWidth 文本描边宽度
    *       ...
    *   rich 富文本,在其中写入样式
    *       width 宽
    *       height 高
    *       backgroundColor 背景色
    *           image 背景图
    *       fontSize 文字大小
    *       lineHeight 行高
    *       fontWeight 文本加粗
    *       ...
    * */
    data.forEach((hero,ind)=>{
        hero.label={
            formatter:'{img|}\n{name|'+hero.name+'}\n{val|战力:'+hero.value+'}',
            textBorderColor:'yellow',
            textBorderWidth:2,
            rich:{
                img:{
                    width:60,
                    height:60,
                    backgroundColor:{
                        image:hero.img
                    }
                },
                name:{
                    fontSize:16,
                    lineHeight:28,
                    fontWeight:'bold'
                },
                val:{}
            }
        };
    });


    /*配置项*/
    const option = {
        title:{text:'英雄战力'},
        series: {
            type: 'pie',
            data,
            radius:'70%',
        }
    };
    myChart.setOption(option);
</script>
</body>
</html>  

 

四、原生图形组件

原生图形组件就是可以自定义图形的组件。

原生图形组件里绘制的图形,可以绑定鼠标事件拖拽事件等。

echarts 有两种点位:坐标位像素位

坐标位有直角坐标位、地理坐标位等。

原生图形的位置就是基于像素位定位的。

echarts 实例对象提供了坐标位和像素位的转换方法:

  • convertToPixel(坐标系,[x,y]) 坐标位转像素位
  • convertFromPixel(坐标系,[x,y]) 像素位转坐标位

案例 – 折线图标记点的拖拽

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>拖拽</title>
    <style>
        #main{
            margin: 20px;
            width: 700px;
            height: 700px;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    /*尺寸*/
    const symbolSize = 20;
    /*点位*/
    const data = [[0,0], [20, 20], [40,40]];
    /*实例化echarts*/
    const myChart = echarts.init(document.getElementById('main'));

    /*1.线绘制折线图*/
    myChart.setOption({
        /*tooltip 提示
        *   triggerOn 提示的触发方式
        *       mousemove 鼠标移动时触发
        *       click 鼠标点击时触发
        *       mousemove|click 移动点击皆可触发
        *       none 不被鼠标移动、点击所触发。可再以后手动触发。
        *   formatter 格式化提示内容
        * */
        tooltip: {
            triggerOn: 'none',
            formatter: function (params) {
                return Math.round(params.data[0]) + ' , ' + Math.round(params.data[1]);
            }
        },
        /*x轴
        *   min,max 刻度区间
        *   type 坐标轴的类型
        *       value 数值轴
        * */
        xAxis: {
            min: 0,
            max: 50,
            type: 'value',
        },
        /*y 轴
        *   属性同x
        * */
        yAxis: {
            min: 0,
            max: 50,
            type: 'value',
        },
        /*系列 series
        *   id 用于在 option 或者 API 中引用组件
        *   type 类型
        *   smooth 圆弧
        *   symbolSize 标记点尺寸
        *   data 数据
        * */
        series: [
            {
                id: 'a',
                type: 'line',
                smooth: true,
                symbolSize: symbolSize,
                data: data,
                /*itemStyle:{
                    opacity:0
                }*/
            }
        ],
    });
    /*2.为标记点添加拖拽功能*/
    /*graphic 原生图形组件
    *   type 图形类型,image, text, circle, sector, ring...
    *   position 位置
    *   shape 相关于图形的属性,不同类型的图形,其中的属性不同
    *   onclick 点击事件
    *   onmousemove 鼠标移动
    * */
    /*myChart.convertToPixel 将直角坐标系上的点转换为像素*/
    /*echarts.util.curry(函数,参数) 函数的柯里化,来自zrender
    * 函数中,this 便是event.target
    * */
    const graphic=data.map((ele,ind)=>{
        return {
            type: 'circle',
            position: myChart.convertToPixel('grid', ele),
            shape: {
                r: symbolSize / 2
            },
            invisible: true,
            draggable: true,
            ondrag: echarts.util.curry(onPointDragging, ind),
            onmousemove: echarts.util.curry(showTooltip, ind),
            onmouseout: echarts.util.curry(hideTooltip, ind),
            z: 100
        };
    });
    myChart.setOption({graphic});

    /*鼠标拖拽时,让折线中的点位随拖拽点变化
    *   convertFromPixel(grid,pos)将拖拽点的像素位解析为直角坐标系的位置
    *   setOption() 更新数据
    * */
    function onPointDragging(dataIndex) {
        data[dataIndex] = myChart.convertFromPixel('grid', this.position);
        myChart.setOption({
            series: [{
                id: 'a',
                data: data
            }]
        });
    }
    /*鼠标在标记点上移动时,触发显示提示事件
    *   type 事件类型,如showTip
    *   seriesIndex 系列在系列集合中的索引位置
    *   dataIndex 标记点在系列中的索引位置
    * */
    function showTooltip(dataIndex) {
        myChart.dispatchAction({
            type: 'showTip',
            seriesIndex: 0,
            dataIndex: dataIndex
        });
    }

    /*鼠标在标记点上移动时,触发隐藏提示事件*/
    function hideTooltip(dataIndex) {
        myChart.dispatchAction({
            type: 'hideTip'
        });
    }
</script>
</body>
</html>

  

原生图形 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原生图形</title>
    <style>
        #main{
            margin: 20px;
            width: 800px;
            height: 700px;
            background: antiquewhite;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    /*实例化echarts*/
    const myChart = echarts.init(document.getElementById('main'));
    /*配置项*/
    let option={
        /*graphic 原生图形组件
        *   type 图形类型,image, text, circle, sector, ring...
        *   position 位置
        *   shape 相关于图形的属性
        *   style 图形样式
        *   draggable 可否拖拽
        *   onmouseover 鼠标划上
        *   onmouseup 鼠标抬起
        *   onmouseout 鼠标划出
        * */
        graphic:{
            id:'c',
            type:'circle',
            shape:{
                r:100
            },
            position:[300,300],
            style:{
                fill:'green'
            },
            draggable:true,
            onmouseover:overFn,
            onmouseout:outFn
        }

    };
    /*绘图*/
    myChart.setOption(option);

    /*事件*/
    function overFn(){
        myChart.setOption({
            graphic:{
                id:'c',
                style:{
                    fill:'yellow'
                },
            }
        });
    }
    function outFn(){
        myChart.setOption({
            graphic:{
                id:'c',
                style:{
                    fill:'green'
                },
            }
        });
    }

</script>
</body>
</html>

 原生图形的位置

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原生图形</title>
    <style>
        #main{
            margin: 20px;
            width: 700px;
            height: 700px;
            background: antiquewhite;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    /*实例化echarts*/
    const myChart = echarts.init(document.getElementById('main'));

    /*绘制坐标系*/
    myChart.setOption({
        /*x轴
        *   min,max 刻度区间
        *   type 坐标轴的类型
        *       value 数值轴
        * */
        xAxis:{
            min:0,
            max:50,
        },

        /*y 轴
        *   属性同x
        * */
        yAxis:{
            min:0,
            max:50,
        }
    });

    /*绘制原生图形*/
    myChart.setOption({
        graphic:{
            id:'c',
            type:'circle',
            shape:{
                r:100
            },
            // position:[10,10],
            position:myChart.convertToPixel('grid',[20,10]),
            style:{
                fill:'green'
            },
        }
    });

</script>
</body>
</html>

 

五、响应式布局

在html 中使用css 中的flex 可以轻松实现响应式布局。

在echarts 里,如何适配不同尺寸的屏幕呢?

  • 简单点的可以通过为尺寸、位置等属性设置百分比来实现。
  • 复杂些的就需要自定义响应规则。

自定义响应规则的方法

  • 建立基础配置项 baseOption
  • 建立规则配置列表 media
  1. 建立query
  2. 建立此规则下的配置信息option
  • echarts 实例基于baseOption 和media 绘制图表
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>响应式布局</title>
    <style>
        html,body{margin: 0;height: 100%}
        #main{
            height: 100%;
            background: antiquewhite;
        }
    </style>
</head>
<body>
<!--建立dom 容器-->
<div id="main"></div>
<!--引入echarts-->
<script src="./js/echarts.min.js"></script>
<script>
    /*实例化echarts*/
    const myChart = echarts.init(document.getElementById('main'));

    /*基础配置项 baseOption,建立两个绘图区
    *   grid 绘图区
    *   xAxis yAxis
    *       min 最小刻度值
    *       max 最大刻度值
    *       gridIndex 绘图区的索引位置
    *
    * */
    const baseOption={
        grid:[
            {left:'10%',right:'55%',top:'10%',bottom:'10%'},
            {left:'55%',right:'10%',top:'10%',bottom:'10%'},
        ],
        xAxis:[
            {min:0,max:50,gridIndex:0},
            {min:0,max:50,gridIndex:1},
        ],
        yAxis:[
            {min:0,max:50,gridIndex:0},
            {min:0,max:50,gridIndex:1},
        ],
    };


    /*media 规则配置列表
    *   query 规则,如maxWidth: 768
    *   option 配置项
    * */
    const media=[
        {
            option:{
                grid:[
                    {left:'10%',right:'55%',top:'10%',bottom:'10%'},
                    {left:'55%',right:'10%',top:'10%',bottom:'10%'},
                ],
            }
        },
        {
            query:{
                maxWidth:768
            },
            option:{
                grid:[
                    {left:'10%',right:'10%',top:'10%',bottom:'55%'},
                    {left:'10%',right:'10%',top:'55%',bottom:'10%'},
                ],
            }
        }

    ];

    /*绘图*/
    myChart.setOption({baseOption,media});


    /*窗口尺寸发生变化resize 时,echarts 实例使用resize() 方法重置尺寸*/
    window.addEventListener('resize',function(){
        myChart.resize();
    })

</script>
</body>
</html>


注:课程来自开课吧

posted @ 2021-10-20 15:44  柳洁琼Elena  阅读(306)  评论(0编辑  收藏  举报