echarts知识梳理

项目需要用echarts,所以来整理梳理一下echarts的知识。
教程链接
源码地址

浏览器画图原理
  1. canvas
    基于像素,放大会失真。echarts基于canvas画图。
  2. svg
    基于对象模型,放大不会失真 。
图形组件
  1. 标题 + 工具栏 + 图例 + 提示框
  2. 坐标轴(X、Y)
简单的直方图和折线图
  1. 在html中准备Dom,要有宽高
  2. 在js中初始化echarts实例
    var myChart = echarts.init(document.getElementById('main'));
  3. 指定图标的配置项和数据
    title 标题
    toolbox 工具箱
    legend 图例
    xAxis yAxis 坐标轴
    series 数据
  4. 将3中的数据,显示在1中的Dom元素中
    myChart.setOption(option);
  5. 折线图的实现 series.type = 'line'即可
常用组件

1. 标题
option.title

文档位置

    title: {
        show:true, // 是否显示
        text: 'ECharts 入门示例', // 主标题
        subtext:'学习ECharts就来慕课网', // 副标题
        left:'right', // 数字就是像素值 ,也可以是 center left right这种值
        borderColor:'red', // 边框颜色
        borderWidth:5, // 边框宽度
        textStyle:{
            fontSize:40 // 字体大小
        }
    },

2. 工具栏
option.toolbox

文档位置

    toolbox: {
        show: true,
        feature: {
            dataView:{  // 展示图表数据,可编辑 -- 1
                show:true
            },
            restore:{ // 配置项还原(编辑之后点击即可还原)-- 2
                show:true 
            },
            dataZoom:{ // 数据区域缩放 -- 3、4
                show:true 
            },
            saveAsImage: { // 保存为图片 -- 5
                show: true
            },
            magicType: { // 图表类型切换 -- 6、7
                type: ['line', 'bar']
            }
        }
    },

参数对应图标

3. 弹框
option.tooltip

    tooltip: {
        show: true, // 是否显示,默认显示
        trigger: 'axis' // 触发方式(X轴触发)
    },

弹框效果

4. 标记线 和 标记点
option.series.markLine
option.series.markPoint

    series: [{
        name: '销量',
        type: 'line',
        data: [5, 20, 36, 10, 10, 20],
        markPoint: {
            data: [
                {type: 'max', name: '最大值'},
                {type: 'min', name: '最小值',symbol:'arrow'}  // symbol -- 标记形状
            ]
        },
        markLine: {
            data: [
                {type: 'average', name: '平均值'}
            ]
        }
    }]
标记线 标记点 效果
其他常用图

1. 饼图
其余步骤一样,不同在于options.series

    legend: {
        orient: 'vertical',
        left: 'left',
        // 图例和series.data中的数据一一对应,可以点击显示或隐藏
        data: ['直接访问','邮件营销','联盟广告','视频广告','搜索引擎'] 
    },
    series : [
        {
            name: '访问来源',
            type: 'pie', // 饼图
            radius : '55%', //  半径大小
            center: ['50%', '60%'], // 圆心位置
            data:[
                {value:335, name:'直接访问'}, // value--占比 name--名字
                {value:310, name:'邮件营销'},
                {value:234, name:'联盟广告'},
                {value:135, name:'视频广告'},
                {value:1548, name:'搜索引擎'}
            ]
        }
    ]

文档位置

2. 仪表图

    series: [
        {
            name: '业务指标',
            type: 'gauge', // 仪表图
            detail: {formatter:'{value}%'},
            data: [{value: 32, name: '完成率'}]
        }
    ]

3. 地图

// 经纬度
var geoCoordMap = {
    '上海': [121.4648,31.2891],
    '东莞': [113.8953,22.901],
    '玉溪': [101.9312,23.8898],
    '珠海': [113.7305,22.1155],
};
// 城市A到其他城市的值
var BJData = [
    [{name:'北京'}, {name:'上海',value:95}],
    [{name:'北京'}, {name:'广州',value:90}],
    [{name:'北京'}, {name:'大连',value:80}],
];
// 飞机图片格式
var planePath = 'path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705.06,1318.313z';
// 将以上格式转化为echarts所需的格式 -- 定义函数
var convertData = function (data) {
    var res = [];
    for (var i = 0; i < data.length; i++) {
        var dataItem = data[i];
        var fromCoord = geoCoordMap[dataItem[0].name];
        var toCoord = geoCoordMap[dataItem[1].name];
        if (fromCoord && toCoord) {
            res.push([{
                name: dataItem[0].name,
                coord: fromCoord
            }, {
                name: dataItem[1].name,
                coord: toCoord
            }]);
        }
    }
    return res;
};
// 格式转化
var color = ['#a6c84c', '#ffa022', '#46bee9'];
var series = [];
[['北京', BJData], ['上海', SHData], ['广州', GZData]].forEach(function (item, i) {
    series.push({
        name: item[0] + ' Top10',
        type: 'lines',
        zlevel: 1,
        // 调样式
        effect: {
            show: true,
            period: 6,
            trailLength: 0.7,
            color: '#fff',
            symbolSize: 3
        },
        // 调样式
        lineStyle: {
            normal: {
                color: color[i],
                width: 0,
                curveness: 0.2
            }
        },
        // 重点 -- 数据
        data: convertData(item[1])
    },
    {
        name: item[0] + ' Top10',
        type: 'lines',
        zlevel: 2,
        effect: {
            show: true,
            period: 6,
            trailLength: 0,
            symbol: planePath,
            symbolSize: 15
        },
        lineStyle: {
            normal: {
                color: color[i],
                width: 1,
                opacity: 0.4,
                curveness: 0.2
            }
        },
        data: convertData(item[1])
    },
    {
        name: item[0] + ' Top10',
        type: 'effectScatter',
        coordinateSystem: 'geo',
        zlevel: 2,
        rippleEffect: {
            brushType: 'stroke'
        },
        label: {
            normal: {
                show: true,
                position: 'right',
                formatter: '{b}'
            }
        },
        symbolSize: function (val) {
            return val[2] / 8;
        },
        itemStyle: {
            normal: {
                color: color[i]
            }
        },
        data: item[1].map(function (dataItem) {
            return {
                name: dataItem[1].name,
                value: geoCoordMap[dataItem[1].name].concat([dataItem[1].value])
            };
        })
    });
});

option.geo 和地图相关的数据
option.series 格式化处理好的数据
3. 散点图
options.series.type = 'scatter'
4. K线图
options.series.type = 'candlestick'
5.雷达图
options.series.type = 'radar'

echarts的高级使用

1.多个坐标系配合 -- 举例,多个y轴

    yAxis: [
        {
            type: 'value',
            name: '水量',
            min: 0,
            max: 250,
            interval: 50,
            axisLabel: {
                formatter: '{value} ml'
            }
        },
        {
            type: 'value',
            name: '温度',
            min: 0,
            max: 25,
            interval: 5,
            axisLabel: {
                formatter: '{value} °C'
            }
        },
    ],
    series: [
        {
            name:'蒸发量',
            type:'bar',
            data:[2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
        },
        {
            name:'降水量',
            type:'line',
            data:[2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]
        },
        {
            name:'平均温度',
            type:'line',
            yAxisIndex: 1,
            data:[2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]
        }
    ]

设置两个y轴,配置多个yaxis属性


用yAxisIndex将值和y轴关联

效果图

2.dataZoom组件

    dataZoom: [{
        type: 'slider',
        start: 10, // 0-100 百分比
        end: 40
    }],
效果图

3.值域漫游

   dataRange: {
       min: 0,
       max: 200,
       calculable: true,
       color: ['#d94e5d','#eac736','#50a3ba'],
       textStyle: {
           color: '#fff'
       }
   },
效果图

个性化图表的样式

文档位置
<script src="echarts.js"></script>
<!-- 引入 vintage 主题 -->
<script src="theme/vintage.js"></script>
<script>
// 第二个参数可以指定前面引入的主题
var chart = echarts.init(document.getElementById('main'), 'vintage');
chart.setOption({
    ...
});
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • 文/一丛兰 一纸素笺谱心曲, 三五知己幸相遇。 十里八乡传佳话, 百万诗友奏韵...
    雪花1阅读 584评论 9 12
  • pt3「过去」 ByConchita 她们的第一次相见,是在一片十分美丽的花田上,旁边还有一条清澈的小溪。那是小E...
    伊丽莎薰云阅读 212评论 0 2
  • 谈到庄子的思想,他很喜欢讲“忘”。里面有一个故事,说有一个人隐居很久,叫徐无鬼,名字很奇怪,说徐无鬼从山上下来,去...
    小食光阅读 341评论 1 0
  • 三年,说久也久,说短也短,就是这几年,执念着一人,开始着未来很长一段的万劫不复。 原本以为就只是喜欢一段时间,可曾...
    lonelyLD阅读 188评论 0 0