原生js实现大屏可视化

[## 数据可视化

  • 借助图形化的手段,清晰有效的沟通信息
  • 数据可视化可以把数据从冰冷的数字转换为图形,揭示数据的规律和道理

可视化适配方案

  • 使用less实现css编写
    使用到less,可以在vscode中安装easy less插件,配合nodejs,然后安装less

npm i less -g

也可以使用下面下载:

cnpm i less -g

详情可以查看less官网,使用方法和sass差不多,官网是中文的,方便阅读

点击此文字进入less中文官网

  • 适配方案
  1. 使用flexible.js+rem实现自适应

下面是flexible.js文件代码

(function flexible(window, document) {
  var docEl = document.documentElement;
  var dpr = window.devicePixelRatio || 1;

  // adjust body font size
  function setBodyFontSize() {
    if (document.body) {
      document.body.style.fontSize = 12 * dpr + "px";
    } else {
      document.addEventListener("DOMContentLoaded", setBodyFontSize);
    }
  }
  setBodyFontSize();

  // set 1rem = viewWidth / 10
  function setRemUnit() {
    var rem = docEl.clientWidth / 24;
    docEl.style.fontSize = rem + "px";
  }

  setRemUnit();

  // reset rem unit on page resize
  window.addEventListener("resize", setRemUnit);
  window.addEventListener("pageshow", function(e) {
    if (e.persisted) {
      setRemUnit();
    }
  });

  // detect 0.5px supports
  if (dpr >= 2) {
    var fakeBody = document.createElement("body");
    var testElement = document.createElement("div");
    testElement.style.border = ".5px solid transparent";
    fakeBody.appendChild(testElement);
    docEl.appendChild(fakeBody);
    if (testElement.offsetHeight === 1) {
      docEl.classList.add("hairlines");
    }
    docEl.removeChild(fakeBody);
  }
})(window, document);

检查页面的html标签是否有font-size即可验证是否引入

  • 设计稿样式改变适配

案例中设计稿样式是1920像素的,flexible.js默认划分成10等分,那么1rem就是192px;我认为太大了,选择划分24等份,1rem为80像素

function setRemUnit(){
    var rem =docEl.clientWidth/24;
    docEl.style.fontStyle=rem+"px";
}
  • 使用cssrem插件将rem设置为1rem的值

vscode中安装cssrem,将CssRem:Root Font Size值设置为80px即可(打开插件面板,点击设置logo进入后搜索关键词即可)

之后使用px会有转换为rem的提示,使用即可

可视化项目头部制作

  • css
body {
    background:url("") no-repeat top center;
    min-width:1024px;
    line-height:1.15;//根据父元素字体大小调节
}
//头部
header {
    //width默认100%
    height:1.25rem;
    background:url("../images/head.png") no-repeat;
    background-size:100% 100%;
    position:relative;  
    //头部标题
    h1 {
        font-size:.475rem;
        color:#fff;
        text-align:center;
        line-height:1rem;
    }
    //显示时间,h1占满整个盒子,所以使用定位
    showTime {
        position:absolute;
        right:.375rem;
        top:0;
        line-height:0.9375rem;
        color:rgba(255,255,255,,0.7);
        font-size:0.25rem;
    }
    
}

  • html
//头部的盒子
<header>
    <h1>数据可视化-Echarts</h1>
    <div class="showTime"></div>
</header>
  • js
var t =null;
t =setTimeout(time,1000);
function time(){
    clearTimeout(t);
    dt =new Date();
    var y = dt.getFullYear();
    var mt =dt.getMonth();
    var day = dt.getDate();
    var h =dt.getHours();
    var m = dt.getMinutes();
    var s =dt.getSeconds();
    document.querySelector(".showTime").innerHTML ='当前时间'+y+'年'+mt+'月'+day+'日'+"-"+h+"时"+m+"分"+s+"秒";
    t= setTimeout(time,1000)//设置定时器,循环运行
}

页面主体部分

  • html
//页面主体盒子
<section class="mainbox">
    <div class="column"></div>
    <div class="column"></div>
    <div class="column"></div>
</section>
  • css
//页面主体盒子
.mainbox {
    min-width:1024px;//这样手机端就看不了了,缩放底线
    max-width:1920px;
    margin:0 auto;//水平居中,不适用于浮动定位元素,还要内联元素
    padding:0.125rem 0.125rem  0 ;
    display:flex;
    
    .column {
        flex:3;//集体占据三分    
    }
    &:ntjh-child(2){
        flex:5;//第二个占据五分,不生效改权重
    }
    
}
  • js

公共盒子面板panel

作为所有表格的容器来使用

  • html
<section class="mainbox> 
    <div class="column">
         <div class="panel">
            <div class="panel_footer"></div>
         </div>
    </div>
    <div class="column"></div>
    <div class="column"></div>
</section>
  • css
.panel {
    height:3.875rem;
    border:1px solid rgba(25,186,139,0.17);
    background:url("../images/line.jpg") rgba(255,255,255,0.04);
    padding:0 0.1875rem 0.5rem;
    margin-bottom;1.1875rem;
    position:relative;
    
    //使用伪元素加上面两个角样式
    &::before {
        content:"";
        position:absolute;
        top:0;
        left:0;
        width:10px;
        height:10px;//这种小像素不需要转换
        border-left:2px solid #02a6b5;
        border-top:2px solid #02a6b5;
    }
    &::after {
        content:"";
        position:absolute;
        top:0;
        right:0;
        width:10px;
        height:10px;//这种小像素不需要转换
        border-right:2px solid #02a6b5;
        border-top:2px solid #02a6b5;
    }
    
    //下面两个角
    .panel-footer {
        position:absolute;
        bottom:0;
        left:0;
        width:100%;
            //使用伪元素加上面两个角样式
            &::before {
                content:"";
                position:absolute;
                left:0;
                bottom:0;
                width:10px;
                height:10px;//这种小像素不需要转换
                border-left:2px solid #02a6b5;
                border-bottom:2px solid #02a6b5;
            }
            &::after {
                content:"";
                position:absolute;
                bottom:0;
                right:0;
                width:10px;
                height:10px;//这种小像素不需要转换
                border-right:2px solid #02a6b5;
                border-bottom:2px solid #02a6b5;
            }
    }
    
}
  • js

柱形图

  • html
<section class="mainbox> 
    <div class="column">
        //里面加上了bar类
         <div class="panel bar">
            <h2>柱形图-就业行业</h2>
            <!--这里放图表-->
            <div class="chart"></div>
            <div class="panel_footer"></div>
         </div>
    </div>
    <div class="column"></div>
    <div class="column"></div>
</section>
  • css
.panel {
    //省略其他的样式代码
    h2 {
        height:.6rem;
        color:#fff;
        line-height:0.6rem;
        text-align:center;
        font-size:0.25rem;
        font-weight:400;
    }
    .chart {
        height:3rem;
    }
}
  • js

复制六份就是六个图表框

两侧图表中间的地图模块

no模块制作(数字模块制作)

  • html
//页面主体盒子
<section class="mainboc>
    <div class="column"></div>
    <div class="column">
    <!--上部数字模块-->
        <div class="no">
         <div class="no-hd">
            <ul>
                <li>123456</li>
                <li>123456</li>
            </ul>
         </div>
         <div class="no-bd">
             <ul>
                <li>前端需求人数</li>
                <li>市场供应人数</li>
            </ul>
         </div>
        </div>
    </div>
    <div class="column"></div>
</section>
  • css
//去除ul样式
li {
list-style:none;
}
//声明图标字体
@font-size{
    font-family:electronicFont;
    src:url("./font/DS-DIGIT.TTF");
}

.panel {
  //数字模块
  .no {
    background:rgba(101,132,226,0.1);
    padding;0.1875rem;
    //no-head制作
        .no-hd {
            position:relative;
            border:1px solid rgba(25,186,139,0.17);
            ul {
                display:flex;
                li {
                    position:relative;
                    flex:1;
                    line-height:1rem;
                    font-size:.875rem;
                    color:#ffeb7b;
                    //使用图标字体
                    font-family:electronicFont;
                }
                //li之间加上一个竖线
                &:nth-child(1)::after{
                 content:"";
                 position:absolute;
                 top:25%;
                 right:0;
                 height:50%;
                 width:1px;
                }
            }
        }
        //给head加上小角
        &::before{
            position:absolute;
            top:0;
            left:0;
            content:'',
            width:30px;
            height:10px;
            border-top:2px solid #02a6b5;
            border-left:2px solid #02a6b5;
        }
          &::after{
            position:absolute;
            bottom:0;
            right:0;
            content:'',
            width:30px;
            height:10px;
            border-bottom:2px solid #02a6b5;
            border-right:2px solid #02a6b5;
        }
        //no-bd设置
        .no-bd {
            ul{
                display:flex;
                li{
                    flex:1;
                    text-align:center;
                    color:rgba(255,255,255,0.7);
                    height:.5rem;
                    line-height:.5rem;
                    font-size:0.225rem;
                    padding-top:0.125rem;
                }
            }
        }
        
   }  
   //给中间大模块加上margin样式
   .column:nth-child(2){
       flex:5;
       margin:0 .125rem .1875rem;
   }
}

map模块

  • html
<div class="column">
    <div class="no"></div>
    <!--地图模块-->
    <div class="map">
        <!--地球球体-->
        <div class="map1"></div>
         <!--球体旋转1-->
        <div class="map2"></div>
        <!--箭头旋转1-->
        <div class="map3"></div>
        <!--地图模块-->
        <div class="chart"></div>
    </div>
</div>
  • css
.map {
    hieght:10.125rem;
    .map1 {
        width:6.475rem;
        height:6.475rem;
        //定位到中央
        position:absolute;
        top:50%;
        left:50%;
        transform:translate(-50%,-50%);
        background:url("../images/map.png");
        opacity:.3;
        //保证背景图跟着缩放
        background-size:100% 100%;
    }
    .map2 {
        //需要做动画,压住之前的球体
        position:absolute;
        top:50%;
        left:50%;
        transform:translate(-50%,-50%);
        width:8.0375rem;
        height:8.0375rem;
        bakcground:url("../images/lbx.png");
        //调用动画
        animation:rotate1 15s linear infinite;
        opacity:0.6;
         background-size:100% 100%;
    }
    .map3 {
         background-size:100% 100%;
         //需要做动画,压住之前的球体
        position:absolute;
        top:50%;
        left:50%;
        transform:translate(-50%,-50%);
        width:7.075rem;
        height:7.075rem;
        bakcground:url("../images/jt.png");
        //调用动画逆时针旋转
        animation:rotate2 15s linear infinite;
        opacity:0.6;
    }
    //地图模块
    .chart {
        position:absolute;
        top:0;
        left:0;
        background-color:pink;
        width:100%;
        height:10.125rem;
    }
    @keyframes rotate1 {
        from {
            transform:translate(-505 -50%) rotate(0deg);
        }
        to {
             transform:translate(-505 -50%) rotate(360deg);
        }
    }
    @keyframes rotate2 {
        from {
            transform:translate(-505 -50%) rotate(0deg);
        }
        to {
             transform:translate(-505 -50%) rotate(-360deg);
        }
    }
}

echarts简介

  • 常见的可视化库
  1. D3.js:目前web端评价最高的JavaScript可视化工具库(入手难)
  2. Echarts.js: 百度出品,apache托管的开源JavaScript可视化工具库
  3. HighCharts.js 国外大公司使用,非商用免费
  4. AntV 蚂蚁金服全新一代可视化方案
  5. HighCharts和Echarts关系像是WPS和Office

点击示例可以看到很多图表

echarts使用五部曲

1. 下载并引入echarts.js文件
2. 准备一个具备大小的DOM容器
3. 初始化echarts实例对象
4. 指定配置项和数据(option)
5. 将配置项设置给echarts实例对象


官网五分钟上手有下载等信息
  • 下面是基本使用
<html>
<head></head>
<style>
    .box {
        height:300px;
        width:300px;
        background-color:pink;
    }
</style>
<body>
    <div class="box"></div>
    <script src="js/echarts.min.js" ></script>
    <script>
        //初始化实例对象
        var myChart = echarts.init(document.querySelector(".box");
        //指定配置项和数据
        var option ={
            title:{
                text:"Echarts 入门示例"
            },
            toolTip:{
                
            },
            legend:{
                
            }
            ...
        }
        //把配置项给实例对象
        myChart.setOption(option);
        
    </script>
</body>
</html>

Echarts基础配置

点击实例–》官网实例

option = {
    //设置线条的颜色
    color:["red","green",'yellow',"blue","black"]
    //设置表格标题
    title:{
        "设置表格标题"
    },
    //图表的提示框组件
    toolTip:{
        //触发方式坐标轴||柱状图的柱体
        trigger:'axis||item'
    },
    //图例组件,点击可以让图形(如折线图的一条线)显示消失
    legend:{
        //series里面有了name值,则legend里面的data可以删掉
        data:["邮件营销","联盟广告"]
    },
    //工具箱组件,可以另存为等
    toolBox:{
        feature:{
            //另存为图片配置
            saveImage:{}
        }
    },
//直角坐标系相关配置
    //网格配置(网格就是图形显示区域,不包含坐标轴),控制图表大小
    grid:{
        left:'3%',
        right:'4%',
        bottom:'3%',
        //是否显示刻度标签
        containLabel:true
    },
    //设置X轴相关配置
    xAixs:{
        //坐标轴显示类型,是子还是数字值,这里是类目
        type:'category',
        //图形开头是否紧贴坐标轴(是否有缝隙)
        boundaryGap:false,
        data:['周一','周二','周三','周四','周五','周六','周天']
    },
    yAxis:{
        //这里是数值,可以和X轴调换
        type:'value'
    },
    //决定显示哪种类型的图表,这里五条线
    series:[
        {
        //图形对象名称(折线图当前这条线的名称)
        name:'邮件营销',
        //数据显示类型,这里是折线图,改为bar为柱形图
        type:'line',
        //数据堆叠,没什么用,线的起点不重叠,需要同一类,如这里为120起点,下面的起点为240,不是同样在120
        stack:'总量',
        data:[120,132,101,13490,230,210]
        },
        {
        name:'广告联盟',
        type:'line',
        stack:'总量',
        data:[120,132,101,13490,230,210]
        },
        {
        name:'广告联盟2',
        type:'line',
        stack:'总量',
        data:[120,132,101,13490,230,210]
        },
        {
        name:'广告联盟3',
        type:'line',
        stack:'总量',
        data:[120,132,101,13490,230,210]
        },
        {
        name:'广告联盟4',
        type:'line',
        stack:'总量',
        data:[120,132,101,13490,230,210]
        }
    ]
}

柱状图bar引入HTML页面中

  • 官网中找到类似实例,按照五部曲实现
    另建index.js实现图形实例创建

  • 使用自调用函数
    防止变量污染,减少命名冲突,里面的变量都是局部变量

//index.js
(function(){
    //实例化对象
    var myChart = echarts.init(document.querySelector(".bar .chart"));
    //指定配置项和数据 
    option = {
    tooltip: {
        trigger: 'axis',
        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
        }
    },
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    xAxis: [
        {
            type: 'category',
            data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
            axisTick: {
                alignWithLabel: true
            }
        }
    ],
    yAxis: [
        {
            type: 'value'
        }
    ],
    series: [
        {
            name: '直接访问',
            type: 'bar',
            barWidth: '60%',
            data: [10, 52, 200, 334, 390, 330, 220]
        }
    ]
};
    //把配置项给实例对象
    myChart.setOption(option);
})();


定制柱状图

  • 将柱子的颜色修改为#2f89cf
option = {
    color:['#2f89cf']
}
  • 将柱子修改为圆角和减小柱子宽度
option = {
    series:[
        {
            name:'名字',
            type:'bar',
            //柱子宽度
            barWidth:'35%',
            data:[10,53,345,64,564,4],
            itemStyle:{
                //修改柱子圆角
                barBorderRadius:5
            }
        }
    ]
}
  • 添加柱体影子
option= {
    toolTip:{
        trigger:'axis',
        axisPointer:{
            //鼠标放上去显示影子或者线
            type:"shadow||line"
        }
    }
}
  • 修改图表大小
option={
    grid:{
        left:"0%",
        top:"10%",
        bottom:"4%",
        right:"0%",
        containLabel:true
    }
}
  • 设置X轴相关信息:修改文字大小和颜色,X轴样式不显示
option ={
    
    xAxis:{
        //修改刻度标签样式
        axisLabel:{
            color:"rgba(255,255,255,.6)",
            fontSize:"12"
        },
        //不显示x坐标轴样式
        axisLine:{
            show:false
        }
    }
    
}
  • 设置y轴的线条样式
option ={
    yAxis:{
        axisLine:{
            lineStyle:{
                color:"rgba(255,255,255,.6)",
                width:2
            }
        }
    }
}
  • y轴分隔线修改(就是x轴上面的几条横着的线)
option ={
    yAxis:{
        //修改Y轴分割线的颜色
        splitLine:{
            lineStyle:{
                color:"rgba(255,255,255,.1)"
            }
        }
    }
}

更换柱状图对应数据

//x轴中更换data数据
data:["旅游",'居家',"汽车游"]
//series中换数据(一般ajax中请求)
data:[100,200,344]

Echarts图表随着屏幕缩放适配

(function(){

    window.addEventListener('resize',function(){
      myChart.resize();  
    })
})()

Y轴显示我们想要的数据,X轴不显示(柱形图)

  • 官网找实例
<div class="column">
    <div class="panel bar2">
        <h2>柱形图-就业行情</h2>
        <div clsas="chart">图表</div>
        <div class=-"panel-footer"></div>
    </div>
</div>
  • 引入样式
(function(){
    //1. 实例化对象
    var myChart =echarts.init(document.querySalector(".bar2  .chart"));
    //2.配置
    option = {
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    xAxis: {
        type: 'value',
        boundaryGap: [0, 0.01]
    },
    yAxis: {
        type: 'category',
        data: ['巴西', '印尼', '美国', '印度', '中国', '世界人口(万)']
    },
    series: [
        {
            name: '2011年',
            type: 'bar',
            data: [18203, 23489, 29034, 104970, 131744, 630230]
        },
        {
            name: '2012年',
            type: 'bar',
            data: [19325, 23438, 31000, 121594, 134141, 681807]
        }
    ]
};
    //3. 配置给对象
    myChart.setOption(0option);
})()
  • 定制
option = {
    grid: {
        left: '22%',
        left: "22%"",
        bottom: '10%',
        containLabel:true//grid大小是否将label包含在内,这里注释掉
    },
    xAxis: {
    show:false//不显示X轴相关信息
    },
    yAxis: {
        type: 'category',
        data: ['巴西', '印尼', '美国', '印度', '中国', '世界人口(万)']//不显示y轴的线
        axisLine:{
            show:false
        },
        //不显示刻度
        axisTick:{
            show:false;
        }
        //Y轴文字颜色设置为白色(刻度标签设置为白色)
        axisLabel:{
            color:"#fff"
        }
    },
    series: [
        {
            name: '2011年',
            type: 'bar',
            data: [18203, 23489, 29034, 104970, 131744, 630230]
        },
        {
            name: '2012年',
            type: 'bar',
            data: [19325, 23438, 31000, 121594, 134141, 681807]
        }
    ]
};
  • 将上面两组柱子修改为一组,以进度条形式显示

(function(){
//定义第一组颜色数组
var myColor = ["#1089E7","#F57474","#56D0E3","f8b448","#8b78f6"]

option = {
    grid: {
        left: '22%',
        left: "22%"",
        bottom: '10%',
        containLabel:true//grid大小是否将label包含在内,这里注释掉
    },
    xAxis: {
    show:false//不显示X轴相关信息
    },
    yAxis: [
            {
                type: 'category',
                data: ['巴西', '印尼', '美国', '印度', '中国', '世界人口(万)']//不显示y轴的线
                axisLine:{
                    show:false
                },
                //不显示刻度
                axisTick:{
                    show:false;
                }
                //Y轴文字颜色设置为白色(刻度标签设置为白色)
                axisLabel:{
                    color:"#fff"
                }
            },
            
            //这是Y轴第二组数据(就是横向柱状图右边的Y轴)
            {
                //显示出来
                show:true,
                data:[1,2,3,4,5],
                //不显示Y轴坐标
                axisLine:{
                    show:false
                }
                //不显示刻度
                axisTick:{
                    show:false
                },
                //刻度标签文本样式设置
                axisLabel:{
                    textStyle:{
                        fontSize:12,
                        color:"#fff"
                    }
                }
                
            }
        ],
        
    //series里面有两组柱子,所以有两组样式
    series: [
        //将第一组改为里面的条
        {
            name: '条',
            type: 'bar',
            data: [18203, 23489, 29034, 104970, 131744, 630230]//修改第一组柱子的圆角
            itemStyle:{
                barBorderRadius:20//第一组都会变为粉色,注释掉不使用
                color:'pink'
                //下面设置使颜色不一致
                    //首先需要外面注册一个颜色数组
                    color:function(params){
                        console.log(params);//这一组的六个柱子对象
                        return myColor[params.dataIndex]
                    }
                
                    
            }
            //修改柱子之间的距离
            barCategoryGap:50,
            //柱子的宽度
            barWidth:10//设置第一组柱子里面的百分比数据
            //显示柱子里面的文字
            label:{
                normal:{
                    show:true,
                    //
                    position:“inside", 
                    //标签内容格式 {a}系列名 ,{b}数据名称,{c}数据值
                    formatter:"{c}%"//自动将第一组date解析出来加上百分比符号
                }
            }
        },
        
        
        //将第二组改为外面的框
        {
            name: '框',
            type: 'bar',
            borderCategoryGap;50,
            barWidth:15,
            itemStyle:{
              //每个颜色消失
              color:"none",
              //给外面边框加上颜色
              borderColor:"#00c1de",
              //给边框加厚
              borderWidth:3,
              //边框加上圆角
              barBorderRadius:15
            },
            data: [19325, 23438, 31000, 121594, 134141, 681807]
        }
    ]
};
  • 将第二组柱子框包含第一组柱子条(使用yAxisIndex,相当于定位)
 series: [
        {
            name: '条',
            type: 'bar',
            data: [18203, 23489, 29034, 104970, 131744, 630230]//加上yAxisIndex定位
            yAxisIndex:0,
            itemStyle:{
                barBorderRadius:20,
                color:'pink'color:function(params){
                        console.log(params);
                        return myColor[params.dataIndex]
                    }
                
                    
            }
            barCategoryGap:50,
            barWidth:10,
            label:{
                normal:{
                    show:true,
                    position:“inside", 
                    formatter:"{c}%"
                }
            }
        },
        {
            name: '框',
            type: 'bar',
            borderCategoryGap;50//给第二组也加上yAxisIndex
            yAxisIndex:1,
            barWidth:15,
            itemStyle:{
              color:"none",
              borderColor:"#00c1de",
              borderWidth:3,
              barBorderRadius:15
            },
            data: [19325, 23438, 31000, 121594, 134141, 681807]
        }
    ]
  • 将坐标轴转过来

发现y轴数据和刻度标签和我们需要的不一样

yAxis里面的inverse:true,//将Y轴翻转,加到yAxis里面

注意第二组也需要改

折线图

  • 找到相应的图形实例进行引用
//大致和上面步骤一致
(function(){
    //1. 实例化对象
    var myChart = echrts.init(document.querySelector(".line .chart")) 
    //2.引入配置
    option = {
   
    tooltip: {
        trigger: 'axis'
    },
    legend: {
        data: ['邮件营销', '联盟广告', '视频广告', '直接访问', '搜索引擎']
    },
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    xAxis: {
        type: 'category',
        boundaryGap: false,
        data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
    },
    yAxis: {
        type: 'value'
    },
    series: [
        {
            name: '邮件营销',
            type: 'line',
            stack: '总量',
            data: [120, 132, 101, 134, 90, 230, 210]
        },
        {
            name: '联盟广告',
            type: 'line',
            stack: '总量',
            data: [220, 182, 191, 234, 290, 330, 310]
        }
    ]
};
//3. 把配置给实例化对象
    myChart.setOption(option);
})()

  • 根据需求进行定制
//需求列表
1. 修改折线图大小,显示边框设置颜色:#012f4a,并显示刻度标签
grid :{
    top:"20%",
    left:"3%",
    right:"4%",
    bottom:"3%",
    show:true,//显示边框
    borderCOlor:"#012f4a",//边框颜色,
    containLabel:true//包含刻度文字在内
}
2. 修改图例组件中的文字颜色#4c9bfd,距离右侧right为10%
legend:{
    textStyle:{
        color:"red"
    },
    //必须使用引号(定位)
    right:"10%"
}
3. x轴相关配置
  3.1 刻度去除
  3.2 x轴刻度标签颜色
  3.3 剔除坐标轴颜色(将来使用Y轴分割线就行了)
  3.4 轴两端不需要内间距boundaryGap
  xAxis:{
      axisTick:{
          show:false
      },
      axisLabel:{
        color:"#4c9bfd"
      },
      axisLine:{
          show:false
      },
      boundaryGap:false//去除轴内间距
     }
 4. y轴相关配置
    4.1去除刻度
    4.2 y轴刻度标签颜色
    4.3 剔除坐标轴颜色
    4.4 分割线颜色设置
    
        前三个和上面一致,第四个
        yAixs:{
            splitLine:{
                lineStyle:{
                    color:"#123f4a"
                }
            }
        }
        
5. 定制两条线的样式
  5.1颜色分别:#00f2f1 #ed3f35
  5.2把折线图修饰为圆滑,series中添加smothsmooth为true
      color:["#00f2f1","#ed3f35"],
      series:[{
          smooth:true
      }]
      
6.折线图更换数据

将ajax请求到的数据渲染到表格中

后端返回给我们两个数组形式,上面的折线图新增功能,点击切换2020年数据和2021年数据(点击按钮放到title里面了)

//后端数据
var yearDate = [
    {
        year:"2020",
        date:[
        //一年的两条线
            [24,40,101,134,90,230,210,230,120,230,210,120],
            [40,64,191,324,290,330,310,213,180,200,180,79]
        ]
    },
      {
        year:"2021",
        date:[、
        //数据没改
            [24,40,101,134,90,230,210,230,120,230,210,120],
            [40,64,191,324,290,330,310,213,180,200,180,79]
        ]
    }
]


//前端代码
$(".line h2").on("click","a",function(){
var obj =  yearData[$(this).index()];
  option.series[0].data = obj.data[0];
    option.series[1].data = obj.data[1];
    //数据变了需要刷新配置
    myCharts.setOption(option);
})

//页面一打开2020年数据
将series中data思数据换成yearData[0].data[0],依次类推

带颜色的折线图(播放量模块的制作)

  • 官网中找实例
//折线图2制作
(function(){
    var myChart = echarts.init(document.querySelector(".line2 .chart"));
    
    option = {
    title: {
        text: '堆叠区域图'
    },
    tooltip: {
        trigger: 'axis',
        axisPointer: {
            type: 'cross',
            label: {
                backgroundColor: '#6a7985'
            }
        }
    },
    legend: {
        data: ['邮件营销', '联盟广告', '视频广告', '直接访问', '搜索引擎']
    },
    toolbox: {
        feature: {
            saveAsImage: {}
        }
    },
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    xAxis: [
        {
            type: 'category',
            boundaryGap: false,
            data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
        }
    ],
    yAxis: [
        {
            type: 'value'
        }
    ],
    series: [
        {
            name: '邮件营销',
            type: 'line',
            stack: '总量',
            areaStyle: {},
            emphasis: {
                focus: 'series'
            },
            data: [120, 132, 101, 134, 90, 230, 210]
        },
        {
            name: '联盟广告',
            type: 'line',
            stack: '总量',
            areaStyle: {},
            emphasis: {
                focus: 'series'
            },
            data: [220, 182, 191, 234, 290, 330, 310]
        },
        {
            name: '视频广告',
            type: 'line',
            stack: '总量',
            areaStyle: {},
            emphasis: {
                focus: 'series'
            },
            data: [150, 232, 201, 154, 190, 330, 410]
        },
        {
            name: '直接访问',
            type: 'line',
            stack: '总量',
            areaStyle: {},
            emphasis: {
                focus: 'series'
            },
            data: [320, 332, 301, 334, 390, 330, 320]
        },
        {
            name: '搜索引擎',
            type: 'line',
            stack: '总量',
            label: {
                show: true,
                position: 'top'
            },
            areaStyle: {},
            emphasis: {
                focus: 'series'
            },
            data: [820, 932, 901, 934, 1290, 1330, 1320]
        }
    ]
};
    myChart.setOption(option);
})()
  • 定制
需求列表
  1. 更换图例组件文字颜色rgba(255,255,255,.5),文字大小为12
  legend:{
      top:"0%",
      textStyle:{
          color:"rgba(255,255,255,.5)",
          fontSize:"12"
      }
  }
  2. 修改图表大小
  grid:{
      left:"10",
      top:"30",
      right:"10",
      bottom:"10",
      containLabel:true
      
  }
  3. X轴相关配置
   3.1 修改文本颜色,文字大小
   3.2 X轴颜色修改
   axisLabel:{
       textStyle:{
           color:“rgba(255,255,255,.6)",
           fontSize:12
       }
   },
   axisLine:{
       lineStyle:{
           color:"rgba(255,255,255,.2)"
       }
   }
   4.y轴配置修改
   axisTick:{
       show:false
   },
   axisLine:{
       lineStyle:{
           color:"rgba(255,255,255,.3)"
       }
   },
   axisLabel:{
       textStyle:{
           color:"rgba(255,255,255,.2)",
           fontSize:12
       }
   },
   splitLine:{
       lineStyle:{
           color:"rgba(255,255,255,.2)"
       }
   }
  • 修改两个线模块配置(注意在series里面定制)
series:[
    {
        smooth:true,//圆滑
        //单独修改当前图线的样式  
        lineStyle:{
            color:"red",
            width:"3"
        },
        //填充区域
        areaStyle:{
            //渐变色,只要复制即可
            //color:“pink”,
            color:new echarts.graphic.LinearGradient(0,0,0,1,[
            {
                offset:0,
                color:"rgba(1,132,213,0.4)"//渐变色起始颜色
            },
            {
                offset:0.8,
                color:"rgba(1,132,213,.1)"//渐变色结束颜色
            }
            ],false),
            shadowColor:"rgba(0,0,0,.1)"
            
        },
        //设置拐点 小圆点,rect正方形,arrow三角
        symbol:"circle",
        //设置拐点大小
        symbolSize:30
        //是否显示拐点,false鼠标经过拐点显示
        showSymbol:false,
        //itemStyle可以设置拐点颜色和边框
        itemStyle:{
            color:"#354544",
            borderColor:"rgba(0,0,0,.1)",
            borderWidth:12
        }
    }
]

饼形图(年龄分布模块的制作)

  • 找实例引入
//删掉了series里面的ememphasis属性,将鼠标移入之后中间的提示给删掉了

(function(){
    //实例化对象
    var myChart =echarts.init(document.querySelector(".pie .chart"));
    //配置
    option = {
    tooltip: {
        trigger: 'item',
        formatter: '{a} <br/>{b}: {c} ({d}%)'
    },
    legend: {
        orient: 'vertical',
        left: 10,
        data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
    },
    series: [
        {
            name: '访问来源',
            type: 'pie',
            radius: ['50%', '70%'],
            avoidLabelOverlap: false,
            label: {
                show: false,
                position: 'center'
            },
         
            labelLine: {
                show: false
            },
            data: [
                {value: 335, name: '直接访问'},
                {value: 310, name: '邮件营销'},
                {value: 234, name: '联盟广告'},
                {value: 135, name: '视频广告'},
                {value: 1548, name: '搜索引擎'}
            ]
        }
    ]
};
//3. 倒入配置
myChart.setOption(option)
})()
  • 定制饼图
需求列表
    1. 修改图例组件在底部并且居中显示
    2. 每个图标的大小和高度修改为10px
    3. 文字大小为12,颜色rgba(255,255,255,.5)
    legend:{
        //距离底部10%
        bottom:"0%",
        //小图标的宽度和高度
        itemWidth:10,
        itemHeight:10,
        //修改图例组件的文字为12px
        textStyle:{
            color:"rgba(255,255,255,.5)",
            fontSize:"12"
        }
    }
    
    
    4. 修改饼形图
     4.1修改水平居中、垂直居中
     4.2修改内圆半径和外圆半径为["40%,60%"],前面通过grid修改大小,这里使用radius
     
     series:[
        {
            name:"年龄分布",
            type:"pie",
            //设置饼形图在容器中位置
            center:["50%",50%"],
            //修改内圆半径和外圆半径,百分比都是相对于容器宽度来说的
            radius:["40%","60%"],
            //不显示文字标签,position:"center"为显示时出现的位置,在圈中间,
            //不加这个将show改为true,每个饼形图外面都有name文字提示
            label:{show:false,position:"center"},
            //不显示连接线,连接线就是链接上面显示时文字的线
            labelLine:{
                show:false
            }
        }
     ]
     
     4.3 更换颜色和相应数据
     //legend中data,因为下面series中有name了,这里省略
     
     //series中数据
     data:[
        {value:1,name:'0岁以下'},
        {value:4,name:"20-29岁"},
        {value:2,name:"30-39岁"},
        {value:1,name:"40-49岁"},
        {value:5,name:"50岁及其以上"}
     ]
     
     //color可以在series中和color中写

南丁格尔玫瑰图(地区分布)

  • 官网找示例
//删除带有还原等功能的toolBox还有title

(function(){
    //
    var myChart =echarts.init(document.querySelector(".pie2"))
    //
    option = {

    tooltip: {
        trigger: 'item',
        formatter: '{a} <br/>{b} : {c} ({d}%)'
    },
    legend: {
        left: 'center',
        top: 'bottom',
        data: ['rose1', 'rose2', 'rose3', 'rose4', 'rose5', 'rose6', 'rose7', 'rose8']
    },

    series: [
 
        {
            name: '面积模式',
            type: 'pie',
            radius: [30, 110],
            center: ['75%', '50%'],
            roseType: 'area',
            data: [
                {value: 10, name: 'rose1'},
                {value: 5, name: 'rose2'},
                {value: 15, name: 'rose3'},
                {value: 25, name: 'rose4'},
                {value: 20, name: 'rose5'},
                {value: 35, name: 'rose6'},
                {value: 30, name: 'rose7'},
                {value: 40, name: 'rose8'}
            ]
        }
    ]
};
//
myChart.setOption(option)
    
})()
  • 定制
需求列表
    1. 颜色设置
    color:["#111111",“#222222”,“#333333”,"#444444","#555555","#666666"]
    2. 修改饼形图大小
    series:[
    {
        radius:["10%","70%"],
        center:["75%","50%"]
    ]
    3.将面积模式(area)改为半径模式(radius)
    series:[{
        roseType:"radius"
    }]
    4. series里面数据替换掉
    {value:20,name:"云南"},按照这种格式编写
    5. 修改文字大小和连接线长度
    ser.es:[{
        //图形的文字标签
        label:{
            fontSize:10
        }
        //修改连接线
        labelLine:{
            length:50,//第一段的线长
            length2:40//第二段的线长
        }
    }]
    5. 图例样式修改
    legend:{
        bottom:"0%",
        itemWidth:10,
        itemHeight:10,
        textStyle:{
            textStyle:{
                color:"rgba(255,255,255,.5)",
                fontSize:12
            }
        }
    }

中国地图模拟飞行模块引入到html中

中国地图其实由很多的点组成的

进入到官网社区,点击gallery,里面也有筛选功能,点击本段文字跳转

从里面找到模拟飞机航线的案例,复制定制使用

我们想要使用中国地图需要使用china.js文件,提供中国地图的js文件

地图下城实现方式

//必须先引入china.js这个文件
<script src="./js/china.js></script>

//模拟飞行航线
(function(){
    
})()

约束屏幕缩放

//小于1024px
@media  screen and (max-width:1024px){
    html{
        //    1024/24得来的字体大小,根据划分数量
        font-size:42px ! important;
    }
}
//大于1920px
@media screen and (min-width:1920){
    html {
        // 也是除以24得到
        font-size:80px !important;
    }
}
  • 图片旋转超出:给外部容器加上overflow:hidden;这样滚动条就不会跳动了

图表自适应

  window.addEventListener("resize", function() {
    myChart.resize();
  });
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原生 JavaScript 数据大屏中,可以使用 Echarts 来实现饼状图的动画效果。下面是一个简单的示例代码,演示如何使用 Echarts 创建并动态更新饼状图的数据: ```javascript // 创建饼状图实例 var chart = echarts.init(document.getElementById('chartContainer')); // 初始化数据 var data = [ { value: 335, name: '直接访问' }, { value: 310, name: '邮件营销' }, { value: 234, name: '联盟广告' }, { value: 135, name: '视频广告' }, { value: 1548, name: '搜索引擎' } ]; // 配置项 var option = { series: [ { name: '访问来源', type: 'pie', radius: '55%', data: data } ] }; // 设置初始配置项 chart.setOption(option); // 更新数据和动画效果 function updateData(newData) { // 更新配置项中的数据 option.series[0].data = newData; // 使用动画效果渲染新数据 chart.setOption(option, true); } // 示例更新数据的方法 setTimeout(function() { var newData = [ { value: 500, name: '直接访问' }, { value: 200, name: '邮件营销' }, { value: 150, name: '联盟广告' }, { value: 80, name: '视频广告' }, { value: 300, name: '搜索引擎' } ]; updateData(newData); }, 2000); ``` 以上代码中,我们首先创建了一个饼状图实例,然后通过配置项 `option` 来设置初始数据和样式。然后,我们使用 `chart.setOption(option)` 将配置项应用到饼状图中。 在需要更新数据时,我们可以通过调用 `updateData(newData)` 方法来更新配置项中的数据,并使用 `chart.setOption(option, true)` 方法来使用动画效果渲染新数据。 你可以根据实际需求修改示例代码中的数据和样式来适应你的项目。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值