wx-charts:基于canvas绘制图表
每日推荐
这篇文章主要介绍了微信小程序图表插件(wx-charts)实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
本文作者
作者:xiaolin3303
链接:https://github.com/xiaolin3303
前言
最近由于工作需要,将应用里的部分功能需要画图表,于是就发现了wx-charts,微信小程序图表工具,charts for WeChat small app,基于canvas绘制,体积小巧。希望对大家有些帮助吧!
1.wx-charts介绍与图表类型
支持的图标类型:
-
饼图 pie
-
圆环图 ring
-
线图 line
-
柱状图 column
-
区域图 area
-
雷达图 radar
参数说明:
opts Object
opts.canvasId String required 微信小程序canvas-id
opts.width Number required canvas宽度,单位为px
opts.height Number required canvas高度,单位为px
opts.title Object (only for ring chart)
opts.title.name String 标题内容
opts.title.fontSize Number 标题字体大小(可选,单位为px)
opts.title.color String 标题颜色(可选)
opts.subtitle Object (only for ring chart)
opts.subtitle.name String 副标题内容
opts.subtitle.fontSize Number 副标题字体大小(可选,单位为px)
opts.subtitle.color String 副标题颜色(可选)
opts.animation Boolean default true 是否动画展示
opts.legend Boolen default true 是否显示图表下方各类别的标识
opts.type String required 图表类型,可选值为pie, line, column, area, ring
opts.categories Array required (饼图、圆环图不需要) 数据类别分类
opts.dataLabel Boolean default true 是否在图表中显示数据内容值
opts.dataPointShape Boolean default true 是否在图表中显示数据点图形标识
opts.xAxis Object X轴配置
opts.xAxis.disableGrid Boolean default false 不绘制X轴网格
opts.yAxis Object Y轴配置
opts.yAxis.format Function 自定义Y轴文案显示
opts.yAxis.min Number Y轴起始值
opts.yAxis.max Number Y轴终止值
opts.yAxis.title String Y轴title
opts.yAxis.disabled Boolean default false 不绘制Y轴
opts.series Array required 数据列表
数据列表每项结构定义
dataItem Object
dataItem.data Array required (饼图、圆环图为Number) 数据
dataItem.color String 例如#7cb5ec 不传入则使用系统默认配色方案
dataItem.name String 数据名称
dateItem.format Function 自定义显示数据内容
2.wx-charts中的方法和事件
方法:
-
updateData(data)
更新图表数据,data:object
,data.categories(可选,具体见参数说明),data.series(可选,具体见参数说明),data.title(可选,具体见参数说明),data.subtitle(可选,具体见参数说明) -
stopAnimation()
停止当前正在进行的动画效果,直接展示渲染的最终结果 -
addEventListener(type, listener)
添加事件监听,type
:String
事件类型,listener
:function
处理方法 -
getCurrentDataIndex(e)
获取图表中点击时的数据序列编号(-1表示未找到对应的数据区域),e
:Object
微信小程序标准事件,需要手动的去绑定touch事件,具体可参考wx-charts-demo中column
图示例 -
showToolTip(e, options?)
图表中展示数据详细内容(目前仅支持line
和area
图表类型),e
:Object
微信小程序标准事件,options
:Object
可选,tooltip的自定义配置,支持option.background
,默认为#000000
;option.format
,function
类型,接受两个传入的参数,seriesItem
(Object, 包括seriesItem.name以及seriesItem.data)和category,可自定义tooltip显示内容。具体可参考wx-charts-demo中line
图示例 -
scrollStart(e), scroll(e), scrollEnd(e)
设置支持图表拖拽系列事件(支持line
,area
,column
),具体参考wx-charts-demo中ScrollLine
图示例
事件:
-
renderComplete
图表渲染完成(如果有动画效果,则动画效果完成时触发)
如何使用事件:
let chart = new wxCharts(...);chart.addEventListener('renderComplete', () => { // your code here});
3.Example
pie chart
image imagevar wxCharts = require('wxcharts.js');
new wxCharts({
canvasId: 'pieCanvas',
type: 'pie',
series: [{
name: 'cat1',
data: 50,
}, {
name: 'cat2',
data: 30,
}, {
name: 'cat3',
data: 1,
}, {
name: 'cat4',
data: 1,
}, {
name: 'cat5',
data: 46,
}],
width: 360,
height: 300,
dataLabel: true
});
ring chart
image imagenew wxCharts({
canvasId: 'ringCanvas',
type: 'ring',
series: [{
name: '成交量1',
data: 15,
}, {
name: '成交量2',
data: 35,
}, {
name: '成交量3',
data: 78,
}, {
name: '成交量4',
data: 63,
}],
width: 320,
height: 200,
dataLabel: false
});
line chart
image image.gifnew wxCharts({
canvasId: 'lineCanvas',
type: 'line',
categories: ['2012', '2013', '2014', '2015', '2016', '2017'],
series: [{
name: '成交量1',
data: [0.15, 0.2, 0.45, 0.37, 0.4, 0.8],
format: function (val) {
return val.toFixed(2) + '万';
}
}, {
name: '成交量2',
data: [0.30, 0.37, 0.65, 0.78, 0.69, 0.94],
format: function (val) {
return val.toFixed(2) + '万';
}
}],
yAxis: {
title: '成交金额 (万元)',
format: function (val) {
return val.toFixed(2);
},
min: 0
},
width: 320,
height: 200
});
columnChart
imagenew wxCharts({
canvasId: 'columnCanvas',
type: 'column',
categories: ['2012', '2013', '2014', '2015', '2016', '2017'],
series: [{
name: '成交量1',
data: [15, 20, 45, 37, 4, 80]
}, {
name: '成交量2',
data: [70, 40, 65, 100, 34, 18]
}],
yAxis: {
format: function (val) {
return val + '万';
}
},
width: 320,
height: 200
});
areaChart
image.gif image.gifnew wxCharts({
canvasId: 'areaCanvas',
type: 'area',
categories: ['2016-08', '2016-09', '2016-10', '2016-11', '2016-12', '2017'],
series: [{
name: '成交量1',
data: [70, 40, 65, 100, 34, 18],
format: function (val) {
return val.toFixed(2) + '万';
}
}, {
name: '成交量2',
data: [15, 20, 45, 37, 4, 80],
format: function (val) {
return val.toFixed(2) + '万';
}
}],
yAxis: {
format: function (val) {
return val + '万';
}
},
width: 320,
height: 200
});
radarChart
[图片上传失败...(image-b73a18-1529549912627)]
new wxCharts({
canvasId: 'radarCanvas',
type: 'radar',
categories: ['1', '2', '3', '4', '5', '6'],
series: [{
name: '成交量1',
data: [90, 110, 125, 95, 87, 122]
}],
width: 320,
height: 200,
extra: {
radar: {
max: 150
}
}
});
4.wx-charts自适应宽度问题
由于无法获取到canvas
的大小尺寸,故图表工具需要调用者传入width
和height
来主动告知。
各类终端的屏幕大小有差异,如何来让wx-charts自适应屏幕的尺寸呢,下面给出一种方法。
比如我们的需求是图表横向铺满屏幕的宽度
wxss
.canvas { width: 100%; height: 200px;}
wxml
<view> <canvas canvas-id="wxChartCanvas" class="canvas"></canvas></view>
js
// 调用API getSystemInfoSync 获取设备信息
// 这里使用同步获取,也可以使用异步方式 getSystemInfo......
let windowWidth = 320;
try {
let res = wx.getSystemInfoSync();
windowWidth = res.windowWidth;
} catch (e) {
// do something when get system info failed
}new Charts({
...
width: windowWidth,
height: 200
});
同样的,如果需求中canvas
与屏幕有一定的间距,还是先获取屏幕的宽度然后减去间距等计算出画布的实际宽度、高度传递给wx-charts
即可。
5.wx-charts项目中如何使用
myAppPage.js
// 路径是wxCharts文件相对于本文件的相对路径
var wxCharts = require('./utils/wxcharts.js');
Page({
...
onLoad: function() {
new wxCharts({
...
});
}
});
【极客小寨】:关注、交流、分享 , 关于Geekxz的那些事儿
○更多分享,请持续关注“极客小寨”微信公众号