本期大纲

1、确定纵坐标的范围并绘制

2、根据真实数据绘制折线

相关阅读:
在微信小程序中绘制图表(part1)
在微信小程序中绘制图表(part3)

关注我的 github 项目 查看完整代码。

确定纵坐标的范围并绘制

为了避免纵坐标的刻度出现小数的情况,我们把纵坐标分为5个区块,我们取最小单位刻度为例如10(能够被5整除),当然真实情况会比这复杂,待会儿我们再讨论。

所以我们的处理输入输出应该是下面的结果

(5, 34.1)  => (10, 40)
(10, 34)   => (10, 40)
(-5.1, 40) => (-10, 40)
// 确定Y轴取值范围
function findRange (num, type, limit) {limit = limit || 10;// upper向上查找,lower向下查找type = type ? type : 'upper';// 进行取整操作,避免while时进入死循环if (type === 'upper') {num = Math.ceil(num);} else {num = Math.floor(num);}while (num % limit !== 0) {if (type === 'upper') {num++;} else {num--;}}return num;
}

好了,初步的确定范围已经完成了,但是细想一下这个范围还是不是很理想,比如用户传入的数据都是小数级别的,比如 (0.2, 0.8),我们输出的范围是(0, 5)这个范围偏大,图表展现的效果则会是上面有大部分的留白,同样用户输入的数据很大,比如(10000, 18000),我们得到的范围是(10000, 18010),这个范围则没什么意义,所以我们需要根据传入的数据的范围来分别确定我们的最小单位刻度。

规定我们的参数格式是这样的:

opts = {...series: [{...data: [15, 20, 45, 37, 4, 80]}, {...data: [70, 40, 65, 100, 34, 18]}]
}

让我们继续进行优化

// 合并数据,将series中的每项data整合到一个数组当中
function dataCombine(series) {return series.reduce(function(a, b) {return (a.data ? a.data : a).concat(b.data);}, []);
}// 根据数据范围确定最小单位刻度
function getLimit (maxData, minData)var limit = 0;var range = maxData - minData;if (range >= 10000) {limit = 1000;} else if (range >= 1000) {limit = 100;} else if (range >= 100) {limit = 10;} else if (range >= 10) {limit = 5;} else if (range >= 1) {limit = 1;} else if (range >= 0.1) {limit = 0.1;} else {limit = 0.01;}
}var dataList = dataCombine(opts.series);
// 获取传入数据的最小值
var minData = Math.min.apply(this, dataList);
// 获取传入数据的最大值
var maxData = Math.max.apply(this, dataList);var limit = getLimit(maxData, minData);var minRange = findRange(minData, 'lower', limit);
var maxRange = findRange(maxData, 'upper', limit);

现在我们动态的确定除了合适的最小刻度范围,接下来我们接着优化一下上面的findRange方法,主要是增加对小数的支持

function findRange (num, type, limit) {limit = limit || 10;type = type ? type : 'upper';var multiple = 1;while (limit < 1) {limit *= 10;multiple *= 10;}if (type === 'upper') {num = Math.ceil(num * multiple);} else {num = Math.floor(num * multiple);}while (num % limit !== 0) {if (type === 'upper') {num++;} else {num--;}}return num / multiple;
}

现在我们已经确定好了Y轴的取值范围,关于如何画出Y轴可以参看 part1 中X轴的绘制方法,此处不再累赘。

Y轴效果图:

opts = {...series: [{...data: [15, 20, 45, 37, 4, 80]}, {...data: [70, 40, 65, 100, 34, 18]}]
}

opts = {...series: [{...data: [0.15, 0.2, 0.45, 0.37, 0.4, 0.8]}, {...data: [0.30, 0.37, 0.65, 0.78, 0.69, 0.94]}]
}

效果还不错,我们接着往下

根据真实数据绘制折线

问题的关键在于确定每个数据点的(x, y)坐标,x坐标比较好确定,我们根据画布的宽度以及opts.categories即可确定。

规定我们的配置为:

config = {xAxisHeight: 30, // X轴高度yAxisWdith: 30   // Y轴宽度
}
var data = [15, 20, 45, 37, 4, 80];
var xPoints = [];
var validWidth = opts.width - config.yAxisWidth;
var eachSpace = validWidth / opts.categories.length;
var start = config.yAxisWidth;data.forEach(function (item, index) {xPoints.push(start + (index + 0.5) * eachSpace);
});

y坐标稍微会复杂一点,需要根据Y轴的范围已经本身的数值进行计算得出。

所以我们计算出的y应该为

y = validHeight * (data - min) / (max - min);
// 由于canvas画布是左上角为原点坐标,故我们变化一下
// 得到最终的y绘制点
y = valideHeight - y;

代码如下:

var data = [15, 20, 45, 37, 4, 80];
var yPoints = [];
var validHeight = opts.height - config.xAxisHeight;
data.forEach(function(item) {var y = validHeight * (item - min) / (max - min);y = validHeight - y;yPoints.push(y);
}

现在我们已经确定了数据点在画布上的绘制坐标,关于如何绘制折现请查看 part1 中相关内容,此处不再累赘。

最终效果图如下:

预告:下一部分我们一起讨论绘制过程中的一些技巧、动画效果和如何工程化我们的项目。

相关阅读

在微信小程序中绘制图表(part1)
在微信小程序中绘制图表(part3)

在微信小程序中绘制图表(part2)相关推荐

  1. 在微信小程序中绘制图表(part3)

    本期大纲 1.饼图绘制 2.如何添加动画效果 3.使用rollup构建项目 相关阅读: 在微信小程序中绘制图表(part1) 在微信小程序中绘制图表(part2) 关注我的 github 项目 查看完 ...

  2. 微信小程序中绘制图表 (AntV F2 的使用)

    1.安装小程序F2组件 npm i @antv/f2-canvas 2.安装好相关依赖包之后,使用微信开发者工具运行项目,点击开发者工具顶部详情,勾选 使用npm模块,再点击菜单栏中工具下的构建npm ...

  3. 如何在微信小程序中使用ECharts图表

    在微信小程序中使用ECharts 1. 下载插件 首先,下载 GitHub 上的 ecomfe/echarts-for-weixin 项目. 下载链接:ecomfe/echarts-for-weixi ...

  4. 在H5、微信小程序中使用canvas绘制二维码、分享海报

    在H5.微信小程序中使用canvas绘制二维码.分享海报 文章目录 在H5.微信小程序中使用canvas绘制二维码.分享海报 前言 一.canvas绘制二维码 1.H5中使用canvas 2.微信小程 ...

  5. 微信小程序setinterval_微信小程序中setInterval的使用方法

    微信小程序中setinterval的使用方法 看了下小程序的画布功能,简单的使用了一下,用蹩脚的逻辑做了个 "弹啊弹,弹走鱼尾纹的小球",一起来看下吧.过程不重要主要是画布的使用哦 ...

  6. 微信小程序-canvas绘制文字实现自动换行

    微信小程序-canvas绘制文字实现自动换行 在使用微信小程序canvas绘制文字时,时常会遇到这样的问题:因为canvasContext.fillText参数为 我们只能设置文本的最大宽度,这就产生 ...

  7. Canvas绘图在微信小程序中的应用:生成个性化海报

    Canvas绘图在微信小程序中的应用:生成个性化海报 如极客时间的一些实现案例: 基础语法 Canvas本质是一个可以使用脚本(通常为JavaScript)来绘制图形的 HTML 元素,默认大小为30 ...

  8. 微信小程序给echarts图表动态赋值

    微信小程序给echarts图表动态赋值 接上一篇:微信小程序引入echart图表 直接上例子(运行需要结合上一篇,拉至文章顶部进入): import * as echarts from '../../ ...

  9. 微信小程序中使用ECharts--折线图、柱状图、饼图等

    微信小程序开发者的反馈,表示他们强烈需要像 ECharts 这样的可视化工具.但是微信小程序是不支持 DOM 操作的,Canvas 接口也和浏览器不尽相同. 因此,ECharts 团队和微信小程序官方 ...

最新文章

  1. linux 三大利器 grep sed awk sed
  2. 用Matlab模拟一个缓冲区大小为10的随机排队系统
  3. java map 查找_Map 查找表操作
  4. boost::ratio_string相关的测试程序
  5. hadoop学习笔记(三):hdfs体系结构和读写流程(转)
  6. 一、css清除浮动方法学习笔记总结(超详细,简单易懂)
  7. Java之品优购课程讲义_day05(8)
  8. go语言学习之helloword
  9. {$POINTERMATH ON} 方便指针操作的编译指令
  10. 服务器搬迁方案_医院机房迁移细则规范 amp; 机房搬迁实施规划方案
  11. 【hadoop】HDFS原理 和 重要特性
  12. 利用FreeImage对图像转格式遇到的问题一则
  13. 求边长为一的正方体中,面对角线组成的正四面体体积.
  14. 若干个数据首尾相连,构成一个圆环,找到连续的4个数之和最大的一段。
  15. 口算加密php怎么使用,从数盲到口算 ——带你玩转RSA加密算法(一)
  16. 一个初一蒟蒻的NOIP2020游记
  17. 我家淇淇-学习穿衣服
  18. python中怎么计数_python怎么计数
  19. 离散数学期末复习-基本回路系统和基本割集系统
  20. 源码交易网站高仿站源网

热门文章

  1. TypeScript基础入门 - 接口 - 可索引的类型
  2. 加快Android Studio的编译速度
  3. 基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]
  4. 移动web开发(三)——字体使用
  5. 2015 Spark 将走向哪里?
  6. 教育行业的互联网焦虑症
  7. java参数化查询_小博老师解析Java核心技术 ——JDBC参数化查询(二)
  8. kali怎么成为管理员_网站死链是什么、是怎么引起的以及死链对SEO优化的影响?...
  9. MAD huashi
  10. BZOJ1578: [Usaco2009 Feb]Stock Market 股票市场