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

本期大纲

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]}]
}

clipboard.png

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]}]
}

clipboard.png

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

根据真实数据绘制折线

问题的关键在于确定每个数据点的(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轴的范围已经本身的数值进行计算得出。

clipboard.png

所以我们计算出的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 中相关内容,此处不再累赘。

最终效果图如下:

clipboard.png

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

相关阅读

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 8.1 新增控件之 CommandBar

上一篇为大家介绍了AppBar 的相关内容&#xff0c;本篇继续介绍CommandBar 的使用方法。与AppBar 相比而言&#xff0c;CommandBar 在开发使用方面较为单一&#xff0c;在按键布局上分为主控区&#xff08;Primary Commands&#xff09;与辅控区&#xff08;Secondary Commands…

很抱歉,你不涨工资,正是因为你“太努力”!

太多人干了一辈子工作却还在原地踏步太多人在公司里任劳任怨最终还一事无成你或许欠缺的不是努力而是思维聪明的人都会投资自己想办法让自己变得无可替代这样老板离不开你的那一天就是你升职加薪的时候快来和我一起看看哪些公众号都能帮你提高能力呢&#xff1f;募格课堂ID&…

php文件锁解锁是删除对应的文件_软件 | 文件解锁强制删除工具 Wise Force Deleter v1.49...

有过电脑里面想删除一个文件&#xff0c;死活删除不了的痛苦吗&#xff1f;用尽了各种办法&#xff0c;关闭进程&#xff0c;删除关联文件&#xff0c;卸载对应的程序&#xff0c;然而还是无法删除&#xff0c;甚至都进入了安全模式删除&#xff0c;依然文件纹丝不动&#xff0…

.NET 7 预览版来啦,我升级体验了

听说.NET 7 来了&#xff0c;站长怎能不尝鲜呢&#xff0c;在除夕当天将体验情况简单汇报下&#xff0c;然后迎新春喽&#xff1a;本文目录.NET 7 详情&#xff08;Proposed .NET 7 Breaking Changes #7131&#xff09;.NET 7 SDK下载尝鲜体验3.1 安装.NET 7 SDK3.2 Hello Word…

【emWin】例程六:设置颜色

实验指导书及代码包下载&#xff1a; 链接&#xff1a;http://pan.baidu.com/s/1kVr25vT 密码&#xff1a;xbkj 实验现象&#xff1a;

渣男劈腿,两个女生却逼他做出选择,结果......

1 生一个女儿有多重要&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 真实版眼睛瞪得像铜铃&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 地表最强撞衫&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 过年时最怕遇见的人&#xff08;素材…

Windows端口被占用处理方法

为什么80%的码农都做不了架构师&#xff1f;>>> 以下文章主要以80端口号为例&#xff0c;如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下…

22543!Windows 11 新预览版发布

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软现已发布 Windows 11 预览版 Build 22543。主要变化和修复1.Windows 11 锁屏界面新增媒体播放控件&#xff0c;该功能将始终使用深色主题。目前这项功能只对部分 Windows 预览体验成员推出&#xff0c;随着时间的推移&…

linux之安装软件出现Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)解决总结

1、问题 安装netmask出现的问题&#xff0c;如下图 2、解决办法 sudo rm -rf /var/lib/dpkg/locksudo rm -rf /var/cache/apt/archives/lock 如下图

关于网站地址解析到65.49.2.178的问题和解决方法

2014/1/21日从下午3点20点开始全球大量互联网域名的DNS解析出现问题&#xff0c;都指向65.49.2.178这个地址,我们下面拥有的服务器其中有一台也出现了这个问题,直接导致短信发送失败&#xff0c;手机信息推送也失败&#xff0c;支付通道出现问题无法完成支付&#xff0c;与第三…

Sublime Text 的快捷方式的用法

2019独角兽企业重金招聘Python工程师标准>>> #1. 假设我们有一个div&#xff0c;内层有10个div&#xff0c;外层div有一个class的样式叫做row&#xff0c;内层div的样式叫做col-md-12。 那么咱们就可以快捷方式编写为&#xff1a; div.row>div.col-md-12*10然后我…

用户体验五要素_UX系列课(三):用户体验影响力金字塔及五大要素

编辑导语&#xff1a;作为一名UX设计师&#xff0c;要从用户的角度出发创造价值&#xff0c;怎么来衡量产品用户体验的标准&#xff1f;本文作者列出了一个“UX影响力金字塔”&#xff0c;分析影响用户体验的五大要素&#xff0c;我们一起来看一下。一、UX影响力金字塔在UX系列…

WPF 实现大转盘抽奖~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇圆形控件01—代码如下一、创建 PrizeItemControl.cs代码如下。using System; using Syste…

如何隐晦地表达“滚”?

1 学到了&#xff01;现在开始带薪难过&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 实力演绎什么叫祸不单行&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 报了驾校之后鞋子都不敢换了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 糊…

Beyond Compare中插入表格数据的教程

众所周知&#xff0c;Beyond Compare是目前市面上功能最强大的文件对比软件&#xff0c;也是类似软件中使用最广泛的一种&#xff0c;Beyond Compare支持文件夹对比&#xff0c;文本对比&#xff0c;表格对比&#xff0c;图片对比&#xff0c;注册表对比&#xff0c;Mp3对比。对…

EF Core 6 新功能汇总(二)

继上一篇之后&#xff0c;这一篇将给大家带来另外十个 EF Core 6 中的新功能特性&#xff0c;包括值转换器、脚手架和 DbContext 的改进等。1HasConversion 支持值转换器在 EF Core 6.0 中&#xff0c;HasConversion 方法的泛型重载方法可以指定内置或自定义的值转换器。public…

linux之lsusb命令和cd -命令使用总结

1、lsusb命令介绍 使用 lsusb 来列出 USB 设备和它的属性,lsusb 会显示驱动和内部连接到你系统的设备。直接在控制台输入 lsusb 即可 2、lsusb简单使用 在控制台输入 lsusb 效果如下 系统中同时使用了 USB 2.0 root hub 驱动和 USB 3.0 root hub 驱动。 bus 002 指明设备…

Fiddler (五) Mac下使用Fiddler

http://www.cnblogs.com/TankXiao/archive/2013/04/18/3027971.html Fiddler是用C#开发的。 所以Fiddler不能在Mac系统中运行。 没办法直接用Fiddler来截获MAC系统中的HTTP/HTTPS, Mac 用户怎么办呢&#xff1f; Fiddler可以允许“远程连接”。 我们可以利用这个间接来实…

她花了8个月让骗子爱上自己,然后把骗子引到警察局......

1 相信你一定可以的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 凤凰传奇的buff有多强&#xff1f;&#xff08;via.段子楼&#xff0c;侵删&#xff09;▼3 老板的名字实在太有味道了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 被微信骰子气死…