zoukankan      html  css  js  c++  java
  • 【高级课程笔记】—— Echarts高级应用(二)

    一、视觉映射

     

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

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>视觉映射</title>
        <style>
            #main{
                margin: 20px;
                 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;
                 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;
                 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;
                 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;
                 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 文本块
        *       '{样式名|文字内容}
     换行'
        *   文本块的样式
        *       textBorderColor 文本描边颜色
        *       textBorderWidth 文本描边宽度
        *       ...
        *   rich 富文本,在其中写入样式
        *       width 宽
        *       height 高
        *       backgroundColor 背景色
        *           image 背景图
        *       fontSize 文字大小
        *       lineHeight 行高
        *       fontWeight 文本加粗
        *       ...
        * */
        data.forEach((hero,ind)=>{
            hero.label={
                formatter:'{img|}
    {name|'+hero.name+'}
    {val|战力:'+hero.value+'}',
                textBorderColor:'yellow',
                textBorderWidth:2,
                rich:{
                    img:{
                        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;
                 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;
                 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;
                 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>


    注:课程来自开课吧

    人与人的差距是:每天24小时除了工作和睡觉的8小时,剩下的8小时,你以为别人都和你一样发呆或者刷视频
  • 相关阅读:
    困扰程序员的30种软件开发问题,你是否时曾相识?
    一位阿里架构师给每个程序员的小建议
    一位阿里架构师给每个程序员的小建议
    一位阿里架构师给每个程序员的小建议
    MongoDB常用语句
    MongoDB常用语句
    ACM2055_ctype.h_cctype
    Serverless 每周小报-20190610
    linux-深度学习环境配置-Centos
    2018 ACM 国际大学生程序设计竞赛上海大都会赛
  • 原文地址:https://www.cnblogs.com/ljq66/p/15428916.html
Copyright © 2011-2022 走看看