如何使用Echarts创建动态K线图

您所在的位置:网站首页 怎么画k线图手动还是自动 如何使用Echarts创建动态K线图

如何使用Echarts创建动态K线图

2023-07-16 01:10| 来源: 网络整理| 查看: 265

如何使用Echarts创建动态K线图

一:了解组件 首先来看官方的例子和使用文档 在这里插入图片描述 Echarts官方实例-----点击此处 我们可以看到有多重的图形和格式可以供我们选择,我们在此选择K线图。 选择这个例子 我们选择该种K线图进行测试。

二:下载组件

Echarts下载链接 GitHub地址下载

三:Demo实现

首先创建一个没有母版页的空页面(使用.cshtml实现,该组件嵌入html和cshtml均可,无区别)

@{ Layout = null; } DOCTYPE html>

我们看到在基本声明格式之上,增加了一个id为container的div,id任意名称均可,与后续js逻辑绑定一直即可

并在其中引入我们下载好的路径文件,Jquery和echarts.min.js(debug和realease版本均可)

值得一提的是,echarts组件部分功能无需css样式支持

创建好以上,我们接下来实现script中的逻辑 在这里插入图片描述 增加一个script位于body的最底部

需要注意的是:echarts整体不支持动态刷新和局部刷新等,所有内容再第一次加载时全部响应完毕,不存在多次响应的支持

数据来源:官方给出的K线图数据格式识别,前后顺序需要对应 在这里插入图片描述

接下来实现数据图中的表头统计,图中的信息等,比如显示名称,几日排序,均线设置和均线的标点显示等,基本信息我们需要在该对象中声明处理完毕

option = { title: { text: IndexName, left: 0 }, tooltip: { trigger: 'axis', axisPointer: { type: 'cross' } }, legend: { data: ['日K', 'MA5', 'MA10', 'MA20', 'MA30'] }, grid: { left: '10%', right: '10%', bottom: '15%' }, xAxis: { type: 'category', data: data0.categoryData, scale: true, boundaryGap: false, axisLine: { onZero: false }, splitLine: { show: false }, splitNumber: 20, min: 'dataMin', max: 'dataMax' }, yAxis: { scale: true, splitArea: { show: true } }, dataZoom: [ { type: 'inside', start: 50, end: 100 }, { show: true, type: 'slider', top: '90%', start: 50, end: 100 } ], series: [ { name: '日K', type: 'candlestick', data: data0.values, itemStyle: { color: upColor, color0: downColor, borderColor: upBorderColor, borderColor0: downBorderColor }, markPoint: { label: { normal: { formatter: function (param) { return param != null ? Math.round(param.value) : ''; } } }, data: [ { name: 'XX标点', coord: ['2013/5/31', 2300], value: 2300, itemStyle: { color: 'rgb(41,60,85)' } }, { name: 'highest value', type: 'max', valueDim: 'highest' }, { name: 'lowest value', type: 'min', valueDim: 'lowest' }, { name: 'average value on close', type: 'average', valueDim: 'close' } ], tooltip: { formatter: function (param) { return param.name + '' + (param.data.coord || ''); } } }, markLine: { symbol: ['none', 'none'], data: [ [ { name: 'from lowest to highest', type: 'min', valueDim: 'lowest', symbol: 'circle', symbolSize: 10, label: { show: false }, emphasis: { label: { show: false } } }, { type: 'max', valueDim: 'highest', symbol: 'circle', symbolSize: 10, label: { show: false }, emphasis: { label: { show: false } } } ], { name: 'min line on close', type: 'min', valueDim: 'close' }, { name: 'max line on close', type: 'max', valueDim: 'close' } ] } }, { name: 'MA5',///周均线 type: 'line', data: calculateMA(5), smooth: true, lineStyle: { opacity: 0.5 } }, { name: 'MA10',///两周均线 type: 'line', data: calculateMA(10), smooth: true, lineStyle: { opacity: 0.5 } }, { name: 'MA20',///四周均线 type: 'line', data: calculateMA(20), smooth: true, lineStyle: { opacity: 0.5 } }, { name: 'MA30',///月均线 type: 'line', data: calculateMA(30), smooth: true, lineStyle: { opacity: 0.5 } }, ] }; if (option && typeof option === 'object') { myChart.setOption(option); }

接下来是数据绑定的逻辑实现,我们通过AJAX调用接口返回的数据集合进行赋值绑定,同时需要把原始数据替换修改为echarts逻辑中的数据格式

// 数据意义:开盘(open),收盘(close),最低(lowest),最高(highest) var data0 = splitData(GetData()); function splitData(rawData) { var categoryData = []; var values = [] for (var i = 0; i < rawData.length; i++) { categoryData.push(rawData[i].splice(0, 1)[0]); values.push(rawData[i]) } return { categoryData: categoryData, values: values }; } function calculateMA(dayCount) { var result = []; for (var i = 0, len = data0.values.length; i < len; i++) { if (i < dayCount) { result.push('-'); continue; } var sum = 0; for (var j = 0; j < dayCount; j++) { sum += parseFloat(data0.values[i - j][1]); } result.push(sum / dayCount); } return result; } function GetData() { var str = window.location.href.toString().split("?")[1]; var item = str.split('&'); var st = item[0].split('=')[1]; var et = item[1].split('=')[1]; var code = item[2].split('=')[1]; IndexName = item[2].split('=')[1]; var arr = []; $.ajax({ url:"接口路径", type: "post", data: { 参数设置 }, async: false, dataType: "json", success: function (data) { console.log(data); arr = data; } }) return arr; }

splitdata函数是处理原始数据并修改为echarts可识别的时间、数据分离的对象下的种数组,一个数组存储时间,一个数组存储是个数据值

calculateMA函数是把前者函数处理过后的数据进行绑定和赋值,最后的逻辑收尾工作

仅此,基本逻辑实现完毕,我们来看看效果(全部源码在最下方) 在这里插入图片描述 效果出来了,和我们预想的相同

全部源码在此

@{ Layout = null; } DOCTYPE html> var dom = document.getElementById("container");//获取元素 var myChart = echarts.init(dom);///初始化组件响应 var app = {};/// var IndexName = "";///图中名称 var option; var upColor = '#ec0000'; var upBorderColor = '#8A0000'; var downColor = '#00da3c'; var downBorderColor = '#008F28'; // 数据意义:开盘(open),收盘(close),最低(lowest),最高(highest) var data0 = splitData(GetData()); function splitData(rawData) { var categoryData = []; var values = [] for (var i = 0; i categoryData: categoryData, values: values }; } function calculateMA(dayCount) { var result = []; for (var i = 0, len = data0.values.length; i result.push('-'); continue; } var sum = 0; for (var j = 0; j title: { text: IndexName, left: 0 }, tooltip: { trigger: 'axis', axisPointer: { type: 'cross' } }, legend: { data: ['日K', 'MA5', 'MA10', 'MA20', 'MA30'] }, grid: { left: '10%', right: '10%', bottom: '15%' }, xAxis: { type: 'category', data: data0.categoryData, scale: true, boundaryGap: false, axisLine: { onZero: false }, splitLine: { show: false }, splitNumber: 20, min: 'dataMin', max: 'dataMax' }, yAxis: { scale: true, splitArea: { show: true } }, dataZoom: [ { type: 'inside', start: 50, end: 100 }, { show: true, type: 'slider', top: '90%', start: 50, end: 100 } ], series: [ { name: '日K', type: 'candlestick', data: data0.values, itemStyle: { color: upColor, color0: downColor, borderColor: upBorderColor, borderColor0: downBorderColor }, markPoint: { label: { normal: { formatter: function (param) { return param != null ? Math.round(param.value) : ''; } } }, data: [ { name: 'XX标点', coord: ['2013/5/31', 2300], value: 2300, itemStyle: { color: 'rgb(41,60,85)' } }, { name: 'highest value', type: 'max', valueDim: 'highest' }, { name: 'lowest value', type: 'min', valueDim: 'lowest' }, { name: 'average value on close', type: 'average', valueDim: 'close' } ], tooltip: { formatter: function (param) { return param.name + '' + (param.data.coord || ''); } } }, markLine: { symbol: ['none', 'none'], data: [ [ { name: 'from lowest to highest', type: 'min', valueDim: 'lowest', symbol: 'circle', symbolSize: 10, label: { show: false }, emphasis: { label: { show: false } } }, { type: 'max', valueDim: 'highest', symbol: 'circle', symbolSize: 10, label: { show: false }, emphasis: { label: { show: false } } } ], { name: 'min line on close', type: 'min', valueDim: 'close' }, { name: 'max line on close', type: 'max', valueDim: 'close' } ] } }, { name: 'MA5',///周均线 type: 'line', data: calculateMA(5), smooth: true, lineStyle: { opacity: 0.5 } }, { name: 'MA10',///两周均线 type: 'line', data: calculateMA(10), smooth: true, lineStyle: { opacity: 0.5 } }, { name: 'MA20',///四周均线 type: 'line', data: calculateMA(20), smooth: true, lineStyle: { opacity: 0.5 } }, { name: 'MA30',///月均线 type: 'line', data: calculateMA(30), smooth: true, lineStyle: { opacity: 0.5 } }, ] }; if (option && typeof option === 'object') { myChart.setOption(option); } function GetData() { var str = window.location.href.toString().split("?")[1]; var item = str.split('&'); var st = item[0].split('=')[1]; var et = item[1].split('=')[1]; var code = item[2].split('=')[1]; IndexName = item[2].split('=')[1]; var arr = []; $.ajax({ url: url: "接口路径", type: "post", data: { 参数设置}, async: false, dataType: "json", success: function (data) { console.log(data); arr = data; } }) return arr; }

至此,我们的实例已经实现完毕, 过程中有错误的地方欢迎指正,共同学习进步!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3