iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue+Echarts实现分时图和交易量图的绘制
  • 723
分享到

Vue+Echarts实现分时图和交易量图的绘制

Vue Echarts绘制分时图Vue Echarts绘制交易量图Vue Echarts 2023-03-15 14:03:20 723人浏览 薄情痞子
摘要

目录1 前言2 分时图2.1 Vue引入Echarts2.2 分时图介绍2.3 分时折线图配置2.4 组合交易量图2.5 鼠标指示数据设置2.6 项目完整代码3 总结1 前言 近来发

1 前言

近来发现Echarts api越发的强大,对于绘制各类图形可以使用Echarts实现,前面已经介绍了柱状图、饼状图、折线图、极坐标图。对于k线图,除了前面介绍的vue+Echarts绘制K线图详解(一)----基本日K图绘制以外,k线图中包含其他多种类型的图形,休息了半载左右,今天继续来进一步深入介绍一下分时图和成交量图,为打造一个完整的版面添砖加瓦。

2 分时图

2.1 vue引入Echarts

前面已经介绍过了,还不知道怎么引入的同学请参考以前的教程:在Vue项目中引入 ECharts。

2.2 分时图介绍

分时图本质上也是一个折线图,横坐标为一天交易的每一分钟,纵坐标为股市的实时单价。除了实现这两个基本的功能以外,还需要带上每分钟交易量图,当鼠标放在图上时,要展示当前时间对应的相关数据;如下图所示:

我们本期要实现的功能为:分时折线图、分时成交量图,鼠标指示展示详细数据,对应成交量颜色划分;其余的一些细节的功能(图切换,细节颜色以及样式处理)我们以后再做介绍。

2.3 分时折线图配置

分时折线图本质上是折线图,我们通过设置图类型为折线即可,重点是对数据的处理,我们的数据源格式是JSON对象数组数据,每一分钟数据如下所示:

{"time":"1678411800","price":"3255.51","ratio":"-0.63%","increase":"-20.58","volume":"2925368","avgPrice":"3261.35","amount":"29.00\u4ebf","timeKey":"0930","datetime":"03-10 09:30","oriAmount":"2900320446","show":"1"},

首先我们需要对数据进行处理,才能应用于Echarts之中;我们分时折线图配置项代码代码如下所示:

 // 横坐标数据配置
        xAxis: [
          {
            type: "cateGory",
            data: this.xData,
            boundaryGap: false,
            axisLine: { onZero: false },
            splitLine: { show: false },
            min: "dataMin",
            max: "dataMax"
          },
        ]
// 纵坐标配置
        yAxis: [
          {
            scale: true,
            splitArea: {
              show: true
            }
          },
        ]
//图形数据配置:
        series: [
          {
            type: "line",
            data: this.hourData,
            symbol: "none", //无标记图案
            lineStyle: {
              width: 1
            }
          },
        ]

其中,this.xData是我们vue页面中的经过处理的横坐标数据,this.hourData是我们页面中经过处理的每小时数据。

注意:series中symbol属性要设置为none,这样的到的折线图上将会不出线标记图案。

数据处理代码如下:

    // 横坐标数据处理
    initxData() {
      for (let i = 0; i < this.klineData.length; i++) {
        this.xData[i] = this.klineData[i].datetime;
      }
    },
        // 数据计算以及拆分,将json数据转为数组数据
    splitData(jsonData) {
      const hourData = [];
      for (let i = 0; i < jsonData.length; i++) {
        hourData.push([
          i,
          jsonData[i].price,
          jsonData[i].increase,
          jsonData[i].volume,
          jsonData[i].ratio,
          jsonData[i].amount,
          jsonData[i].datetime
        ]);
      }
      return hourData;
    }

其中, this.klineData是我们页面引入的json数据。

到此我们可以来看一下分时折线图的效果:

可以看到得到的折线图就是为我们的分时折线图。

2.4 组合交易量图

交易量图为2.2图中底部的红绿交间的柱状图,交易量图本质是一个柱状图,我们可以看到有两个特点:

1.横坐标与分时折线图公用,且柱状图在交易图下方;

2.当前为涨时,柱子为红色,当前为跌时,柱子为绿色;

对于特点1,在我们之前介绍的图中,都是公用坐标系的图,这里新知识点就是不公用坐标系,但是公用横坐标数据应该怎么处理;就是在xAxis、yAxis和series中设置两个对象出来,代表两个不同的坐标西,然后将两个坐标系的横坐标进行对齐即可;

代码如下:

// 横坐标数据
        xAxis: [
          // 折线图
          {
            type: "category",
            data: this.xData,
            boundaryGap: false,
            axisLine: { onZero: false },
            splitLine: { show: false },
            min: "dataMin",
            max: "dataMax"
          },
          // 柱状图
          {
            type: "category",
            gridIndex: 1, //x 轴所在的 grid 的索引,默认位于第一个 grid。
            data: this.xData,
            boundaryGap: false,
            axisLine: { onZero: false },
            axisTick: { show: false },
            splitLine: { show: false },
            axisLabel: { show: false },
            min: "dataMin",
            max: "dataMax"
          }
        ],
        // 纵坐标配置
        yAxis: [
          {
            scale: true,
            splitArea: {
              show: true
            }
          },
          {
            scale: true,
            gridIndex: 1, // y 轴所在的 grid 的索引,默认位于第一个 grid
            splitNumber: 2,
            axisLabel: { show: false },
            axisLine: { show: false },
            axisTick: { show: false },
            splitLine: { show: false }
          }
        ],
         series: [
          {
            type: "line",
            data: this.hourData,
            symbol: "none", //无标记图案
            lineStyle: {
              width: 1
            }
          },
          {
            name: "Volume",
            type: "bar",
            xAxisIndex: 1,
            yAxisIndex: 1,
            data: this.culomnValue
          }
        ]   

对于特点2,控制每个柱状图颜色不同,我们需要用到visualMap.pieces属性;官网上对该属性的说明是:自定义『分段式视觉映射组件(visualMapPiecewise)』的每一段的范围,以及每一段的文字,以及每一段的特别的样式。

我们直接上代码以及讲解,来看这个属性怎么使用,代码如下:

         visualMap: {
          type: "piecewise",
          show: false, //不展示map,只应用对应颜色划分逻辑
          seriesIndex: 1, //指定取哪个系列的数据
          dimension: 2,
          // 定义每一段的颜色
          pieces: [
            {
              value: -1,
              color: this.downColor
            },
            {
              value: 1,
              color: this.upcolor
            }
          ]
        },

这段代码的解释是:当series的data数据里面有value==-1的值时,使用color为this.downColor,value==1时,使用color为this.upcolor.

此时,我们还需要对颜色数据进行处理一下,将k线图对应时间段的增长和下跌展示在数组里面,成交量数据处理代码如下:

    // 初始化交易数据和交易柱状图颜色参数
    initCulomnColor() {
      this.culomnColor[0] = this.klineData[0].increase > 0 ? 1 : -1;
      this.culomnValue[0] = [0, this.klineData[0].volume, -1];
      for (let i = 1; i < this.klineData.length; i++) {
        this.culomnColor[i] =
          this.klineData[i].price > this.klineData[i - 1].price ? 1 : -1;
        this.culomnValue[i] = [
          i,
          this.klineData[i].volume,
          this.culomnColor[i]
        ];
      }
    },

到这里我们成交量柱状图即可渲染出来了,下一步就是将折线图和柱状图位置进行调整,给两个图分配合适的区域,代码如下:

 // 图像位置配置
        grid: [
          {
            left: "10%",
            right: "10%",
            height: "50%"
          },
          {
            left: "10%",
            right: "10%",
            top: "65%",
            height: "18%"
          }
        ],

grid配置两个对象分别代表折线图和柱状图位置;

融合之后我们看到的效果图如下:

2.5 鼠标指示数据设置

k线图的要求是当鼠标指示在图的某个位置时,需要将这个时间段的详细数据展示出来;在此我们需要要利用到tooltip属性,但这个属性默认之后展示当前横坐标和纵坐标的值,吐过需要对展示的数据进行配置的话,我们还需要借助tooltip.fORMatter属性来返回我们想要的展示的数据,该属性可拓展范围非常广,本次不展开介绍,只介绍在k线图中的基本使用。代码如下:

tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "cross" //十字准星指示器
          },
          borderWidth: 1,
          borderColor: "#ccc",
          padding: 10,
          textStyle: {
            color: "#000"
          },
          formatter: function(param) {
            param = param[0];
            return [
              "时间: " + param.data[6] + '<hr size=1 style="margin: 3px 0">',
              "价格: " + param.data[1] + "<br/>",
              "涨跌额: " + param.data[2] + "<br/>",
              "成交量: " + param.data[3] + "<br/>",
              "涨跌幅: " + param.data[4] + "<br/>"
            ].join("");
          }
        },

我们将:时间、价格、涨跌额、成交量、涨跌幅五个属性展示在页面上,样式从简。得到的效果如下:

至此基本完成了分时折线图和交易量图的绘制;

2.6 项目完整代码

vue项目完整代码如下:

<template>
  <div class="echart" id="mychart" style="width:100%; height: 500px;"></div>
</template>

<script>
import * as echarts from "echarts";
import SZHourData from "./data/hourData.TS";

export default {
  data() {
    return {
      upcolor: "#FF0000", //增长颜色
      upBorderColor: "#8A0000",
      downColor: "#008000", // 下跌颜色
      downBorderColor: "#008F28",
      klineData: [], //k线图数据
      hourData: [], //charts表格小时数据
      xData: [],
      culomnColor: [], //颜色
      culomnValue: []
    };
  },
  mounted() {
    // 数据初始化
    this.initData();
    // 图标初始化
    this.initEcharts();
  },
  methods: {
    initData() {
      this.klineData = SZHourData.priceinfo;
      this.hourData = this.splitData(this.klineData);
      this.initxData();
    },
    initEcharts() {
      const option = {
        title: {
          text: "上证指数",
          left: 0
        },
        tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "cross" //十字准星指示器
          },
          borderWidth: 1,
          borderColor: "#ccc",
          padding: 10,
          textStyle: {
            color: "#000"
          },
          formatter: function(param) {
            param = param[0];
            return [
              "时间: " + param.data[6] + '<hr size=1 style="margin: 3px 0">',
              "价格: " + param.data[1] + "<br/>",
              "涨跌额: " + param.data[2] + "<br/>",
              "成交量: " + param.data[3] + "<br/>",
              "涨跌幅: " + param.data[4] + "<br/>"
            ].join("");
          }
        },

        visualMap: {
          type: "piecewise",
          show: false, //不展示map,只应用对应颜色划分逻辑
          seriesIndex: 1, //指定取哪个系列的数据
          dimension: 2,
          // 定义每一段的颜色
          pieces: [
            {
              value: -1,
              color: this.downColor
            },
            {
              value: 1,
              color: this.upcolor
            }
          ]
        },
        // 图像位置配置
        grid: [
          {
            left: "10%",
            right: "10%",
            height: "50%"
          },
          {
            left: "10%",
            right: "10%",
            top: "65%",
            height: "18%"
          }
        ],
        // 横坐标数据
        xAxis: [
          // 折线图
          {
            type: "category",
            data: this.xData,
            boundaryGap: false,
            axisLine: { onZero: false },
            splitLine: { show: false },
            min: "dataMin",
            max: "dataMax"
          },
          // 柱状图
          {
            type: "category",
            gridIndex: 1, //x 轴所在的 grid 的索引,默认位于第一个 grid。
            data: this.xData,
            boundaryGap: false,
            axisLine: { onZero: false },
            axisTick: { show: false },
            splitLine: { show: false },
            axisLabel: { show: false },
            min: "dataMin",
            max: "dataMax"
          }
        ],
        // 纵坐标配置
        yAxis: [
          {
            scale: true,
            splitArea: {
              show: true
            }
          },
          {
            scale: true,
            gridIndex: 1, // y 轴所在的 grid 的索引,默认位于第一个 grid
            splitNumber: 2,
            axisLabel: { show: false },
            axisLine: { show: false },
            axisTick: { show: false },
            splitLine: { show: false }
          }
        ],
        dataZoom: [
          {
            type: "inside",
            xAxisIndex: [0, 1],
            start: 50, //展示的数据范围,默认为50%-100%
            end: 100
          },
          {
            show: true,
            xAxisIndex: [0, 1],
            type: "slider",
            top: "90%",
            start: 50, //展示的数据范围,默认为50%-100%
            end: 100
          }
        ],
        series: [
          {
            type: "line",
            data: this.hourData,
            symbol: "none", //无标记图案
            lineStyle: {
              width: 1
            }
          },
          {
            name: "Volume",
            type: "bar",
            xAxisIndex: 1,
            yAxisIndex: 1,
            data: this.culomnValue
          }
        ]
      };
      const myChart = echarts.init(document.getElementById("mychart"));
      myChart.setOption(option);
      //随着屏幕大小调节图表
      window.addEventListener("resize", () => {
        myChart.resize();
      });
    },
    // 横坐标数据处理
    initxData() {
      for (let i = 0; i < this.klineData.length; i++) {
        this.xData[i] = this.klineData[i].datetime;
      }
      this.initCulomnColor();
    },
    // 初始化交易数据和交易柱状图颜色参数
    initCulomnColor() {
      this.culomnColor[0] = this.klineData[0].increase > 0 ? 1 : -1;
      this.culomnValue[0] = [0, this.klineData[0].volume, -1];
      for (let i = 1; i < this.klineData.length; i++) {
        this.culomnColor[i] =
          this.klineData[i].price > this.klineData[i - 1].price ? 1 : -1;
        this.culomnValue[i] = [
          i,
          this.klineData[i].volume,
          this.culomnColor[i]
        ];
      }
    },
    // 数据计算以及拆分,将json数据转为数组数据
    splitData(jsonData) {
      const hourData = [];
      for (let i = 0; i < jsonData.length; i++) {
        hourData.push([
          i,
          jsonData[i].price,
          jsonData[i].increase,
          jsonData[i].volume,
          jsonData[i].ratio,
          jsonData[i].amount,
          jsonData[i].datetime
        ]);
      }
      return hourData;
    }
  }
};
</script>

3 总结

本次介绍的Echarts新属性的使用较多,不知各位有没有体会到echarts的强大,若能将各种属性进行融汇贯通,则变强指日可待。需要注意以上代码仅供学习参考,非项目级别代码,里面存在各种未考虑边界值问题,以及可能存在的兼容性问题,请各位同学知晓。

到此这篇关于Vue+Echarts实现分时图和交易量图的绘制的文章就介绍到这了,更多相关Vue Echarts绘制分时图 交易量图内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue+Echarts实现分时图和交易量图的绘制

本文链接: https://www.lsjlt.com/news/199953.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue+Echarts实现分时图和交易量图的绘制
    目录1 前言2 分时图2.1 vue引入Echarts2.2 分时图介绍2.3 分时折线图配置2.4 组合交易量图2.5 鼠标指示数据设置2.6 项目完整代码3 总结1 前言 近来发...
    99+
    2023-03-15
    Vue Echarts绘制分时图 Vue Echarts绘制交易量图 Vue Echarts
  • Vue+Echarts怎么实现分时图和交易量图绘制
    这篇文章主要介绍“Vue+Echarts怎么实现分时图和交易量图绘制”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue+Echarts怎么实现分时图和交易量图绘制”文章能帮助大家解决问题。分时图1...
    99+
    2023-07-05
  • Vue+Echarts实现基本K线图的绘制
    目录1 引入Echarts1.1 安装1.2 引入1.3 基本使用2 基础K线图2.1 基础k线图2.2 基础日k图3 总结1 引入Echarts 1.1 安装 使用如下命令通过 n...
    99+
    2023-03-15
    Vue Echarts绘制K线图 Vue Echarts K线图 Vue K线图 Vue Echarts
  • Vue+Echarts实现绘制动态折线图
    目录1 引入Echarts1.1 安装1.2 引入1.3 基本使用2 动态折线图2.1 基本折线图2.2 动态折线图补充1 引入Echarts 1.1 安装 使用如下命令通过 npm...
    99+
    2023-03-19
    Vue Echarts绘制动态折线图 Vue Echarts绘制折线图 Vue Echarts 折线图 Vue Echarts
  • Vue Echarts如何实现多功能图表绘制
    这篇文章主要介绍“Vue Echarts如何实现多功能图表绘制”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue Echarts如何实现多功能图表绘制”文章能帮助大家解决问题。...
    99+
    2023-07-05
  • vue使用echarts绘制中国地图的实现代码
    1. 插入echarts 所需模块 import echarts from "echarts"; import 'echarts/map/js/china' // 使用中国地图需...
    99+
    2024-04-02
  • 怎么使用vue+echarts绘制折线图、柱状图和扇形图
    这篇“怎么使用vue+echarts绘制折线图、柱状图和扇形图”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用vue+...
    99+
    2023-07-05
  • Vue+Echarts绘制饼图的示例详解
    目录1 引入Echarts1.1 安装1.2 引入1.3 基本使用2 基本饼状图3 为饼图添加标题等属性3.1 标题图例3.2 数据展示3.3 样式设置4 饼图扩展5 总结1 引入E...
    99+
    2023-03-19
    Vue Echarts绘制饼图 Vue Echarts饼图 Vue Echarts
  • 怎么使用Vue+Echarts实现基本K线图的绘制
    本篇内容介绍了“怎么使用Vue+Echarts实现基本K线图的绘制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 引入Echarts1.1...
    99+
    2023-07-05
  • 怎么使用Vue+Echarts实现绘制动态折线图
    今天小编给大家分享一下怎么使用Vue+Echarts实现绘制动态折线图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 引入...
    99+
    2023-07-05
  • Flask框架利用Echarts实现绘制图形
    目录实现绘制饼状图实现绘制柱状图实现绘制折线图echarts是百度推出的一款开源的基于JavaScript的可视化图表库,该开发库目前发展非常不错,且支持各类图形的绘制可定制程度高,...
    99+
    2024-04-02
  • vue使用ECharts实现折线图和饼图
    在开发后台管理项目时,需要统计后台用户数据,以折线图和饼图的形式显示,这边采用apache-echarts来实现需求。 1.安装echarts和引入 npm install ec...
    99+
    2024-04-02
  • Python+matplotlib实现量场图的绘制
    目录前言1. 量场图概述什么是量场图?量场图使用场景绘制量场图方法2. 量场图属性设置颜色设置透明度设置向量箭头尺寸设置坐标中向量箭头位置设置向量箭头宽度3. 绘制量场图步骤4. 小...
    99+
    2024-04-02
  • 基于Echarts如何实现绘制立体柱状图
    本篇内容主要讲解“基于Echarts如何实现绘制立体柱状图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Echarts如何实现绘制立体柱状图”吧!实现方法先写一个常规的柱状图在这个基础上进行...
    99+
    2023-07-05
  • Qt实现实时鼠标绘制图形
    目录功能实现1:记录图形第一个绘制点2:实时获取鼠标最新位置并绘图3:释放绘制点,绘制最终图形总结上一章节介绍了关于QGraphicsView的基础讲解,以及简单的类图创建,由上一章...
    99+
    2024-04-02
  • vue中怎么使用echarts和echarts-gl实现3D饼图环形饼图
    今天小编给大家分享一下vue中怎么使用echarts和echarts-gl实现3D饼图环形饼图的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2023-07-05
  • vue结合echarts绘制一个支持切换的折线图实例
    目录vue+echarts绘制一个支持切换的折线图使用echarts实现折线图问题vue+echarts绘制一个支持切换的折线图 在项目中做了一个基础的折线图效果,样式如下 接下来...
    99+
    2022-11-13
    vue echarts 绘制折线图 echarts绘制折线图
  • Python+matplotlib如何实现量场图的绘制
    这篇文章主要介绍“Python+matplotlib如何实现量场图的绘制”,在日常操作中,相信很多人在Python+matplotlib如何实现量场图的绘制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Pyt...
    99+
    2023-06-21
  • canvas简易绘图的实现示例
    小编给大家分享一下canvas简易绘图的实现示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!图片如下:代码如下:<!DOCTYPE html&g...
    99+
    2023-06-09
  • OpenCV 图像绘制的实现
    目录+直线绘制圆形绘制矩形绘制椭圆型绘制自定义形状绘制文本+直线绘制 参数解析:(图像矩阵,直线起始坐标, 直线终止坐标、颜色、线条厚度) import cv2 import n...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作