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

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

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

二:下载组件

Echarts下载链接
GitHub地址下载

三:Demo实现

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


@{
    Layout = null;
}
<!DOCTYPE html>
<html style="height: 100%">
<head>
    <meta charset="utf-8">
    <script src="~/echarts/dist/echarts.min.js"></script>
    <script src="~/Scripts/jquery-3.3.1.js"></script>
</head>
<body style="height: 100%; margin: 0">

    <div id="container" style="height: 550px;"></div>


</body>
</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 + '<br>' + (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>
<html style="height: 100%">
<head>
    <meta charset="utf-8">
    <script src="~/echarts/dist/echarts.min.js"></script>
    <script src="~/Scripts/jquery-3.3.1.js"></script>
</head>
<body style="height: 100%; margin: 0">

    <div id="container" style="height: 550px;"></div>

    <script type="text/javascript">
        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 < 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;
        }

        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 + '<br>' + (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;
        }
    </script>
</body>
</html>

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

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
<p>ECharts (Enterprise Charts 商业产品图表库) 提供商业产品常用图表,底层基于ZRender(一个全新的轻量级canvas类库),创建了坐标系,图例,提示,工具箱等基础组件,并在此上构建出折线图、柱状图、散点图、K线图、饼图、雷达图、地图、和弦图、力导向布局图、仪表盘以及漏斗图,同时支持任意维度的堆积和多图表混合展现。</p><p>Echarts device Echarts explorer   支持IE6/7/8/9+,chrome、firefox、safari、opera   (IE8- power by excanvas )</p><p>特色 我们诚挚邀请你翻阅这份在线文档 《 Why ECharts ? 》 你可以从中更直观的体验到ECharts的特性以及快速浏览到所有图表类型。 *文档中展现的个别特性在IE8-中并没有得到支持,所以建议使用IE9+、chrome、safari、firefox或opera等现代浏览器阅读这份文档。</p><p>Echarts mix 混搭 混搭的图表会更具表现力也更有有趣味,ECharts提供的图表(共11类17种)支持任意混搭: 折线图(面积图)、柱状图(条形图)、散点图(气泡图)、K线图、 饼图(环形图)、雷达图、地图、和弦图、力导布局图、仪表盘、漏斗图。 混搭情况下一个标准图表:包含唯一图例、工具箱、数据区域缩放、值域漫游模块,一个直角坐标系(可包含一条或多条类目轴线,一条或多条值轴线,最多上下左右四条)</p><p>拖拽重计算 拖拽重计算特性(专利)带来了数据统计图表从未有过的用户体验,允许用户对统计数据进行有效的提取、整合,甚至在多个图表间交换数据,赋予了用户对数据进行挖掘、整合的能力。</p><p>Echarts 拖拽重计算 Echarts 数据视图 数据视图 如果你所呈现的数据足够让用户所关心,那么他们将不满足于查看可视化的图表,要去逐一迎合他们下载保存,数据分享,加工整合已有数据等等需求? 或许你只要给予一个“,”分隔的数据文本他们就懂了,这就是ECharts的数据视图!当然,你可以重载数据视图的输出方法,用你独特的方式去呈现数据。 如果你的用户足够的高端,你甚至可以打开数据视图的编辑功能,跟拖拽重计算相比,这可是批量的数据修改!</p><p>动态类型切换 很多图表类型本身所表现的能力是相似的,但由于数据差异、表现需求和个人喜好的不同导致最终图表所呈现的张力又大不一样,比如折线图和柱状图的选择,系列数据是堆叠还是平铺总是让人头疼。 ECharts提供了动态类型切换,让用户随心所欲的切换到他所需要的图表类型和堆叠状态。</p><p>Echarts 动态类型切换 Echarts 图例开关 图例开关 多系列数据的同时展现呈现出丰富内容,但如何让用户切换到他所关心的个别系列上? ECharts提供了方便快捷的多维度图例开关,可以随时切换到你所关心的数据系列。</p><p>数据区域选择 数据可以是无限的,但显示空间总是有限的,数据区域选择组件提供了大数据量中漫游的能力,让用户选择并呈现他所关心的数据区域。 配合随动的均值(极值)标线,标注展现强大的数据剖析能力。 try this 》</p><p>Echarts 数据区域缩放 Echarts 多图联动 多图联动 多系列数据在同一个直角系内同时展现有时候会产生混乱,但他们又存在极强的关联意义不可分离? ECharts提供了多图联动的能力(connect),能做的可不仅仅是鼠标划过的详情显示,连接的多个图表会共享组件事件并且实现了保存图片时的自动拼接。 try this 》</p><p>值域漫游 基于坐标的图表(如地图、散点图)通过色彩变化表现数值的大小能直观形象的展示数据分布。 但如何聚焦到我所关心的数值上?我们创造了称为值域漫游的功能,让你可以轻松进行数值筛选。</p><p>Echarts 值域漫游 Echarts 炫光特效 炫光特效 我们知道,很多时候我们需要一些吸引眼球的能力。 ECharts支持标注标线的炫光特效,特别用在地图上轻松实现百度迁徙数据可视化特效</p><p>大规模数据模式 如何展现成千上百万的数据?貌似除了用专业的统计工具(如MATLAB)外别无选择? 不,在拥有如此多交互特性下ECharts依然可以做到直角系图表(折、柱、散点、K线)20万数据秒级内渲染完成,这对于常规的应用,用现代浏览器就足以轻松展现百万规模的数据!</p><p>Echarts 大规模散点图 Echarts 动态数据添加 Echarts 动态数据添加 动态数据添加 如果你需要展示有实时变化的数据,相信这个动态接口会对你很有帮助。</p><p>标线辅助 趋势线?平均线?上升通道?支持位?专业的你自然知道该怎么
在Vue中编写EchartsK线图,首先需要下载Echarts库,可以通过npm install echarts --save命令进行下载。然后,在Vue组件中引入Echarts库,并创建Echarts的挂载实例。在mounted生命周期钩子函数中初始化Echarts实例,并进行相关的K线图绘制。 以下是一个示例代码,展示了如何在Vue中编写EchartsK线图: ```javascript <template> <div ref="kLineChart" style="width: 100%; height: 400px;"></div> </template> <script> import echarts from 'echarts' export default { mounted() { // 初始化Echarts实例 const kLineChart = echarts.init(this.$refs.kLineChart) // K线图的数据 const kLineData = \[ // 数据格式示例 \[2320.26, 2320.26, 2287.3, 2362.94\], \[2300, 2291.3, 2288.26, 2308.38\], // ... \] // 设置K线图的配置项 const option = { // 配置项省略,根据实际需求进行设置 // ... series: \[{ type: 'candlestick', data: kLineData, // ... }\] } // 绘制K线图 kLineChart.setOption(option) // 监听窗口大小变化,自适应图表大小 window.addEventListener('resize', () => { kLineChart.resize() }) } } </script> ``` 在上述示例代码中,我们首先在模板中创建一个div元素,并通过ref属性给它一个引用名。然后,在mounted生命周期钩子函数中,通过this.$refs.kLineChart获取到这个div元素,并将其作为Echarts实例的挂载点。接着,我们可以根据实际需求设置K线图的数据和配置项,最后调用setOption方法绘制K线图。同时,我们还监听了窗口大小变化事件,以便在窗口大小改变时自适应调整图表大小。 请注意,上述代码仅为示例,实际使用时需要根据具体需求进行适当的修改和调整。 #### 引用[.reference_title] - *1* [vue中使用Echarts绘制K线图](https://blog.csdn.net/weixin_42614080/article/details/103749943)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Vue+ECharts实现可视化地图](https://blog.csdn.net/u011924274/article/details/124941788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值