画三维 K线图 蜡烛图

  • 概述
  • 效果图
    • 正面
    • 正面近景
    • 鸟瞰
    • 侧面
    • 近观俯视
  • 构建一个类
  • 初始化环境
  • 设置环境背景
  • 初始化摄像机
  • 设置相机的位置
  • 设置相机镜头的位置
  • 初始化场景
  • 创建坐标系
  • 蜡烛图的特点
    • 总结几个特点
    • 画小方块
    • 画蜡烛图
  • 测试数据
  • 运行展示

当写完本系列后,我会把源代码分享出来给大家。本课程也会持续更新与矫正。欢迎留言指正!

概述

平时做Excel表格,都少不了要画图表之类的。所以,本作品的图表功能也必不可少。为了与时俱进,我就打算做个3D版的K线图,让股民能够360度全方位了解那些行情。

于是就选择了最近这些年非常成熟的 WEBGL,为了能够先快速出结果。就先选择了 Three.js 作为框架。刚开始不太熟悉,就在网上搜了 WEBGL中文网 1 报了个课程速成一下,就撸起袖子开始搞起来。

更多高级功能可以查一下官方文档2

效果图

正面

正面近景

鸟瞰

侧面

近观俯视

构建一个类

class three_d{constructor(){}}

初始化环境

/**
* @property {Function} initThree 初始化整个容器
* @param {Number}
* @returns {NaN} 无返回
*/
initThree() {var that = this;this.renderer = new THREE.WebGLRenderer({antialias : true, // 抗锯齿开关,设置为false,可以提高性能。alpha : this.alpha // 设置背景透明度});// 设置画布的尺寸this.renderer.setSize(this.width, this.height);// 绑定了点击事件this.renderer.domElement.onclick = that.onMouseClick.bind(this);// 绑定了右击事件this.renderer.domElement.oncontextmenu = that.oncontextmenu.bind(this);// 将初始化完成的画布,绑定到Dom树中。document.getElementById(this.canvasID).appendChild(this.renderer.domElement);
}

设置环境背景

/**
* @property {Function} setbg 设置背景
* @returns {NaN} 无返回
*/
setbg(color){this.renderer.setClearColor(color, 1.0);
}

初始化摄像机

/**
* @property {Function} initCamera 初始化摄像机
* @param {Number} width 画布的宽度
* @param {Number} height 画布的高度
* @returns {NaN} 无返回
*/
initCamera() {/*PerspectiveCamera 透视相机:(fov,aspect,near,far)fov 视角(类似眼睛的睁开的大小)aspect 宽高比near 近平面far 远平面*/this.camera = new THREE.PerspectiveCamera(30, this.width / this.height, 1, 10000);
}

设置相机的位置

/**
* @property {Function} setCameraposition 设置相机的位置
* @param {Number} x x坐标
* @param {Number} y y坐标
* @param {Number} z z坐标
* @returns {NaN} 无返回
*/
setCameraposition(x,y,z) {//相机坐标的定位this.camera.position.x = x;this.camera.position.y = y;this.camera.position.z = z;this.setCameraUp(0,1,0);
}

设置相机镜头的位置

/**
* @property {Function} setCameraUp 设置相机顶部快门指向的矢量方向
* @param {Number} x 相机顶部快门指向的矢量方向的x坐标
* @param {Number} y 相机顶部快门指向的矢量方向的y坐标
* @param {Number} z 相机顶部快门指向的矢量方向的z坐标
* @param {Object} lookAt { x : 0, y : 0, z : 0 }
* @returns {NaN} 无返回
*/
setCameraUp(x,y,z,lookAt) {var lookAt = lookAt || {x : 0,y : 0,z : 0}// up 代表相机顶部快门指向的矢量方向this.camera.up.set(x,y,z);// lookAt 代表镜头对准的方向this.camera.lookAt(lookAt);console.log(this.camera.position)this.camera.updateProjectionMatrix();
}

初始化场景

/**
* @property {Function} initScene 初始化场景
* @returns {NaN} 无返回
*/
initScene() {this.scene = new THREE.Scene();
}

创建坐标系

由于画K线图是基于右手坐标系的,如下图:

/**
* @property {Function} initcoordinate 创建坐标系
* @param {Number} size 坐标系的尺寸
*/
initcoordinate(size){// 首先创建一个对象元素组var group = new THREE.Group();// size 是设置坐标系的尺寸边界。因为是以 0 作为原点,所以如果size = 100,那么以0开始的话,就是最大值为99。var min = -1*size-1;// 开始画辅助线for(var i = size;i>min;i--){group.add(this.creatLine([-1*size,i,0,0xe0e0e0],[size,i,0,0xe0e0e0]));group.add(this.creatLine([i,-1*size,0,0xe0e0e0],[i,size,0,0xe0e0e0]));group.add(this.creatLine([-1*size,0,i,0xe0e0e0],[size,0,i,0xe0e0e0]));group.add(this.creatLine([i,0,-1*size,0xe0e0e0],[i,0,size,0xe0e0e0]));}var x = this.creatLine([-1*size,0,0,0xff0000],[size,0,0,0x00ff00]); // 创建一个纯色的线段var y = this.creatLine([0,-1*size,0,0xff0000],[0,size,0,0x00ff00]); // 创建一个纯色的线段var z = this.creatLine([0,0,-1*size,0xff0000],[0,0,size,0x00ff00]); // 创建一个纯色的线段group.add(x);group.add(y);group.add(z);this.scene.add(group); // 将画好的辅助线添加到画布场景中。return group;
}

蜡烛图的特点

总结几个特点

  • 颜色分为:红色,绿色
  • 图形组成:矩形,一条线

画小方块

/*** @property {Function} creatcolorCube 创建纯色方块* @param {Number} w 宽* @param {Number} h 高* @param {Number} l 长* @param {Number} x 横坐标* @param {Number} y 纵坐标* @param {Number} z 深度坐标* @param {Hex} color 颜色(十六进制)* @param {Function} action 回调函数* @returns */creatcolorCube(w,h,l,x,y,z,color,action){var geometry = new THREE.BoxGeometry(w,h,l);var material = new THREE.MeshLambertMaterial({color:color});var mesh = new THREE.Mesh(geometry,material);mesh.position.x = x;mesh.position.y = y;mesh.position.z = z;// 设置了图形的动作函数if(typeof action === "function"){mesh._action = action;}this.scene.add(mesh); // 添加到场景中return mesh;}

画蜡烛图

/*** @property {Function} candleCube 画蜡烛图* @param {Number} open 开盘值* @param {Number} close 收盘值* @param {Number} high 区间最高点* @param {Number} low 区间最低点* @param {Number} x 横坐标位置*/
candleCube(open,close,high,low,x){var weight = 0.5; // 矩形的宽度var color = 0x000000; // 设置蜡烛图颜色,初始值为黑色if(open > close){ // 如果开盘值大于收盘值color = 0x00ff00; // 设置绿色}else{ // 如果开盘值小于收盘值color = 0xff0000;}var hsize = Math.abs(open-close); // 矩形的长度var highlowsize = Math.abs(high-low); // 线的长度var y = (open+close)/2; // 蜡烛图在Y轴的高度// 画线var highlow = this.creatcolorCube(0.1,highlowsize,0.1,x,y,0,0x000000);// 画矩形var openclose = this.creatcolorCube(weight,hsize,weight,x,y,0,color,(thisobj)=>{thisobj.rotation.y -= 0.06;});// 当被点击时的事件openclose._onclick = function(){console.log("openclose._onclick");}// 当鼠标移入时的事件openclose._onMouseOn = function(){console.log("openclose.position:");}// 当鼠标移出时的事件openclose._onMouseLeave = function(){console.log("openclose._onMouseLeave");}
}

大致上,功能就基本完成了。我们开始测试一下。

测试数据

var data2 = [];
var size = 30;
var temp = {open: 5 ,close: 5 ,high: 10 ,low: 10
}
data2.push(temp)
for(var i = 1;i<100;i++){// 对测试数据做了一些约束。以避免展示效果乱七八糟。temp = {open: data2[data2.length-1].open + (-1)**Math.round(Math.random()*1)*Math.round(Math.random()*2) + (-1)**Math.round(Math.random()*1)*Math.round(Math.random()*1),close: data2[data2.length-1].open + (-1)**Math.round(Math.random()*1)*Math.round(Math.random()*1),high: data2[data2.length-1].high + (-1)**Math.round(Math.random()*1)*Math.round(Math.random()*2) + (-1)**Math.round(Math.random()*1)*Math.round(Math.random()*1),low: data2[data2.length-1].high + (-1)**Math.round(Math.random()*1)*Math.round(Math.random()*1)}console.log(temp)data2.push(temp)
}

运行展示

var theChart = this.initcoordinate(100);// 画坐标系与辅助线
theChart._action = (thisobj)=>{// thisobj.rotation.y += 0.001;
}// 导入数据,画蜡烛图
var length = data2.length;
for(var i=0; i<length;i++){console.log(i,':',data2[i].open,data2[i].close,data2[i].high,data2[i].low)this.candleCube(data2[i].open,data2[i].close,data2[i].high,data2[i].low,i-50);
}


  1. WEBGL中文网 ↩︎

  2. https://threejs.org/docs/index.html ↩︎

【用JS自制表格软件玩数据】9. 自制三维 K线图 蜡烛图相关推荐

  1. 【用JS自制表格软件玩数据】2.读取 xls 文件

    读写Excel Excel文档的包结构 Excel文档的组织形式 Content Types 主要内容(worksheet) 关联(Relationships) 第三方库 SheetJS 工作原理介绍 ...

  2. 【用JS自制表格软件玩数据】6. 单元格的多选

    单元格的框选,列选择,行选择 框选 列选择 行选择 列的右键菜单 行的右键菜单 当写完本系列后,我会把源代码分享出来给大家.本课程也会持续更新与矫正.欢迎留言指正! 框选 在Excel 表格中,一般我 ...

  3. plotly基于dataframe数据绘制股票自定义K线图

    plotly基于dataframe数据绘制股票自定义K线图 #  绘制蜡烛图并自定义可视化形式: import plotly as py import plotly.graph_objs as go ...

  4. 蜡烛图plotly_Python数据可视化:如何用mplfinance创建蜡烛图

    Python数据可视化:如何用mplfinance创建蜡烛图 Python数据可视化:如何用mplfinance创建蜡烛图 一图胜千言,使用Python的matplotlib库,可以快速创建高质量的图 ...

  5. python画k线图_python自动获取行情数据,并画k线图

    1.概述 本例子为画k线图,同时画出5日,10日,30日均线,且鼠标移动到上面会显示当前交易日,开盘价,收盘价,最高价,最低价. 移动平均线:Moving Average,简称MA,MA是用统计分析的 ...

  6. Python获取股票数据并绘制相应K线图,看这个就够了!

    Python对股票的K线可视化 前言 说明 注意 数据获取 Tushare获取股票数据 获取医疗器械板块数据(代码部分) 获取股票数据(代码部分) 数据预处理 变量中文化(代码部分) K线绘制 代码部 ...

  7. python蜡烛图预测_Python数据可视化:如何用mplfinance创建蜡烛图

    一图胜千言,使用Python的matplotlib库,可以快速创建高质量的图形. 我们团队推出一个新的系列教程:Python数据可视化,针对初级和中级用户,将理论和示例代码相结合,使用matplotl ...

  8. tushare获取数据用pyecharts画k线图

    tushare ID:505405 import pyecharts.options as opts from pyecharts.charts import Kline import tushare ...

  9. Python数据可视化:如何用mplfinance创建蜡烛图

    一图胜千言,使用Python的matplotlib库,可以快速创建高质量的图形. 我们团队推出一个新的系列教程:Python数据可视化,针对初级和中级用户,将理论和示例代码相结合,使用matplotl ...

最新文章

  1. 【CCNP考试】2010-01-31-北京-845(PASS)
  2. python的运行窗口-在 Python 窗口中执行工具
  3. 快速生成一个二维矩阵Python
  4. 魅族升级鸿蒙,魅族要“弯道超车”?率先升级鸿蒙OS,挥别安卓系统
  5. 整合.NET WebAPI和 Vuejs——在.NET单体应用中使用 Vuejs 和 ElementUI
  6. 改善Python程序的91个建议(二)
  7. Nik Collection 3.3.0中文版 (摄影师必备ps滤镜插件套装)支持big surv
  8. 用什么 软件测试无线频段,Wirelessmon无线频段与信号强度扫描工具软件使用技巧...
  9. python风变编程是骗局吗-请问风变编程的Python课怎么样?
  10. Altium Designer——usb信号线布线注意的问题——应使用差分布线
  11. UPS电源设备消防与电气安全要求
  12. 用摄像管替换电视机电路里的显现管的摄像机
  13. Android 仿京东淘宝多规格选择
  14. mfc连接oracle12c,MFC ADO连接Oracle12c数据库 类库文件
  15. mp2551总线收发器芯片作用_高速CAN收发器MCP2551
  16. install - graph-tool
  17. 【渝粤题库】陕西师范大学292311国际金融Ⅰ 作业(高起专)
  18. SAP QM 检验批里某检验特性的取样数量跟检验计划设置不符?
  19. 《MySQL高级篇》三、存储引擎
  20. 【MPI编程】矩阵向量乘法--解法三(子矩阵块分解)【高性能计算】

热门文章

  1. Uos统信系统 CA根证书搭建
  2. linux cups工作原理,Linux打印系统CUPS原理分析
  3. 三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解
  4. 9.10 安卓常用工具类之一 权限 ---- PermissionUtil
  5. 【新观点】孙悟空其实是太上老君炼的丹药变成的
  6. 使用Android模拟机开发调试移动端页面
  7. 关于接口自动化测试(2)
  8. KISSY基础篇乄KISSY之IO前奏
  9. Java基础—心型代码
  10. 蛰伏四年,他才是满帮成功上市背后的关键先生