- 基于
wx-charts微信小程序图表改造成,适用于uni-app平台的跨端图表插件,感谢原作者xiaolin3303,原插件gitHub地址:https://github.com/xiaolin3303/wx-charts
【开源不易、改造不易、哪(拿)来简单】如本插件解决了您的问题,请一定要回来给个【5星评价】哦,您的支持是我的动力,感谢您的评价!!如遇到问题,请先参见页面最后章节【常见问题】解决,如没有您的问题,请在页面最下面【撰写评论】,尽量不要在【问答】中提问(因有可能会漏掉您的问题)。
- 2019.05.xx 计划加入柱状图、饼图、环形图、雷达图等
ToolTip事件 - 2019.05.xx 计划加入
堆叠图、条状图、K线图、分时图 - 2019.05.08 计划加入
第二种仪表盘样式,增加《亲手教您如何改造wx-charts,打造您的专属图表》教程。 - 2019.05.06 完善X轴Y轴网格设置,增加X轴网格设置,增加XY轴
虚线网格绘制,gridType网格线型 'solid'为实线、'dash'为虚线。整理并归类帮助文档。 - 2019.05.05 完善
圆弧进度图增加起始结束角度自定义,新增背景颜色自定义,新增整圆进度图,参数请参考demo。 - 2019.05.04 完善
仪表盘更新数据时指针切换动画,增加仪表盘数据标签。 - 2019.05.01 新增
仪表盘图,图表类型gauge,可以高度自定义,参数请参考demo。注意原圆弧进度条的图表类型变更为arcbar,给您带来不便请谅解 - 2019.04.30 新增
opts.title.offsetY标题纵向偏移距离,opts.subtitle.offsetY副标题纵向偏移距离,适用于ring、arcbar及即将上线的gauge,详见demo圆环图示例。 - 2019.04.28 修改demo为动态数据以帮助初学者使用,即后台获取数据后实例化图表;新增柱状图
自定义颜色,传入数据标准如下(可混合使用):series:[{name: '成交量1',data:[15, {value:20,color:'#f04864'},45, 37, 43, 34]},{name: '成交量2',data:[30, {value:40,color:'#facc14'}, 25, 14, 34, 18]}] - 2019.04.23 增加
opts.xAxis.scrollShow参数,默认为false,在图表拖拽时,是否显示滚动条,因为有些朋友可能不需要显示滚动条。增加背景颜色为其他颜色的示例,因为有些朋友设置的不太正确,请参考柱状图。详见v1.5.2demo页面。 - 2019.04.22 修复区域图拖拽模式下线段连接错位问题
- 2019.04.21 增加图表拖拽图
滚动条显示当前拖拽进度,scrollBackgroundColor为滚动条背景色,scrollColor为滚动条颜色,均可自定义,详见demo折线图一 - 2019.04.19 增加
图表拖拽示例,支持的图表有柱状图、折线图和区域图,除头条小程序外,其他各端现已全部支持拖拽功能(头条小程序canvas不支持点击事件),需配合绑定@touchstart,@touchmove,@touchend方法 - 2019.04.18 修复
圆弧进度图示例中进度数值JS计算精度引起的小数位数问题,加Math.round()解决,感谢开发者M_少发现问题。更正参数说明中几个错误描述 - 2019.04.17 增加
自定义显示数据标签文案示例,请下载1.4.1版本,参见圆环图ring数据事例 - 2019.04.16 新增
圆弧进度图,图表类型arcbar,详见demo,感谢作者[email protected]提供思路 - 2019.04.15 支持
横屏模式,新增rotate参数,默认flase,示例见折线图二 - 2019.04.14 支持百度、头条小程序,实现彻底跨全端
- 2019.04.12 支持支付宝小程序(开发者工具不显示,上传代码真机预览可以显示)
- 2019.04.01 改造成uni-app跨端组件
- 饼图
pie - 圆环图
ring - 线图
line - 柱状图
column - 区域图
area - 雷达图
radar - 圆弧进度图
arcbar - 仪表盘
gauge
- 改造后的插件可以跨端使用,支持H5、小程序(微信/支付宝/百度/头条)、APP,调用简单方便、性能及体验极佳。
- 虽然没有Echarts及F2图表功能强大,但可以实现一套业务逻辑各端通用,并解决了H5端图表显示模糊等问题。
- 支持单页面多图表,demo中单页10个图表,响应速度超快。
- 支持入场动画及ToolTip动画效果。
- 独特支持
横屏模式感谢masterLi提供需求。
- 相比Echarts及F2的复杂的设置,本插件几乎等于傻瓜式的配置。
- Echarts在跨端使用更复杂,本插件只需要简单的两个
<canvas>标签轻松区别搞定,代码整洁易维护。 - 本插件打包后的体积相比Echarts小很多很多,所以性能更好。
- 如果您是uni-app初学者,那么强烈建议您使用wx-charts,并且目前可以跨全端通用,减少工作量,增强一致性体验。
- 图表样式均可自定义,懂js的都可以读懂插件源码,直接修改wxcharts.js源码即可。
- 本插件原为我公司产品所用,经过大量测试,反复论证并加以改造而成,请各位放心使用。
- 为何要改造wx-charts?
- 并不是所有图表插件直接拿来就可以满足客户需求,如果您的UI设计师设计一个图表,如下图:
- 您会发现这个图表即使在echarts里也不是很好实现,那么就需要我们自己动手去实现。下面就让我们一起来完成,本文旨在抛砖引玉,希望各位朋友能够更好的应用wx-charts来完成您的项目,如果您有更好的设计,请提交您的PR到githubuni-wx-charts跨端图表,帮助更多朋友,感谢您的付出及贡献!
import wxCharts from '../../components/wx-charts/wxcharts.js';
<template>
<view>
<view class="qiun-charts">
<!--#ifdef H5 || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO-->
<canvas canvas-id="canvasColumn" id="canvasColumn" class="charts" :style="{'width':cWidth*pixelRatio+'px','height':cHeight*pixelRatio+'px', 'transform': 'scale('+(1/pixelRatio)+')','margin-left':-cWidth*(pixelRatio-1)/2+'px','margin-top':-cHeight*(pixelRatio-1)/2+'px'}"></canvas>
<!--#endif-->
<!--#ifdef MP-WEIXIN || APP-PLUS -->
<canvas canvas-id="canvasColumn" id="canvasColumn" class="charts"></canvas>
<!--#endif-->
</view>
</view>
<template>通过cWidth、cHeight、pixelRatio三个参数解决H5端canvas组件在高分屏下模糊的问题
<script>
import wxCharts from '../../components/wx-charts/wxcharts.js';
var _self;
var canvaColumn=null;
export default {
data() {
return {
cWidth:'',
cHeight:'',
pixelRatio:1
}
},
onLoad() {
_self = this;
//#ifdef H5 || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO
uni.getSystemInfo({
success: function (res) {
if(res.pixelRatio>1){
_self.pixelRatio =2;
//正常这里_self.pixelRatio给2就行,如果要求高可用下行
//_self.pixelRatio =res.pixelRatio;
}
}
});
//#endif
this.cWidth=uni.upx2px(750);
this.cHeight=uni.upx2px(500);
this.getServerData();
},
onReady() {
},
methods: {
getServerData(){
uni.request({
url: 'https://www.easy-mock.com/mock/5cc586b64fc5576cba3d647b/uni-wx-charts/chartsdata',
data:{
},
success: function(res) {
let Column={categories:[],series:[]};
Column.categories=res.data.data.Column.categories;
Column.series=res.data.data.Column.series;
if(Column.categories.length>0 && Column.series.length>0){
_self.showColumn("canvasColumn",Column);
}
}
});
},
showColumn(canvasId,chartData){
canvaColumn=new wxCharts({
canvasId: canvasId,
type: 'column',
legend:true,
fontSize:11,
background:'#FFFFFF',
pixelRatio:_self.pixelRatio,
rotate:false,//新增横屏模式(非必填参数,默认false)
animation: true,
categories: chartData.categories,
series: chartData.series,
xAxis: {
disableGrid:true
},
yAxis: {
//disabled:true
},
dataLabel: true,
width: _self.cWidth*_self.pixelRatio,
height: _self.cHeight*_self.pixelRatio,
extra: {
column: {
width: _self.cWidth*_self.pixelRatio*0.45/chartData.categories.length
}
}
});
},
changeData(){
//这里只做了柱状图数据动态更新,其他图表同理。
canvaColumn.updateData({
series: Data.ColumnB.series,
categories: Data.ColumnB.categories
});
},
}
}
</script>
var canvaColumn=null;不是必须定义的变量,如果需要动态更新数据或者需要交互显示ToolTip则需要定义。- 如果在H5端使用,
cWidth和cHeight是必须定义的(当然你也可以用别的变量名),需要注意的是要和当前canvas中的样式定义的数值相等,即uni-app中的upx数值相等。pixelRatio参数是解决了H5端高分屏canvas模糊而设置的,非H5端给1即可,H5端正常给2就可以,当然如果项目需求较高,设置为当前设备的像素比也没问题。
<style>
.charts{width: 750upx; height:500upx;background-color: #FFFFFF;}
</style>###通用基础配置项
| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
| opts | Object | ||
| opts.canvasId | String | required | 微信小程序canvas-id |
| opts.width | Number | required | canvas宽度,单位为pxH5端高分屏需要乘像素比 |
| opts.height | Number | required | canvas高度,单位为pxH5端高分屏需要乘像素比 |
| opts.type | String | required | 图表类型,可选值为pie, line, column, area, ring, radar, arcbar, gauge |
| opts.pixelRatio | Number | required | 像素比,默认为1,非H5端引用无需设置 |
| opts.rotate | Boolean | 默认false | 横屏模式,默认为false |
| opts.fontSize | Number | 默认13px | 全局默认字体大小(可选,单位为px,默认13px)高分屏不必乘像素比,自动根据pixelRatio计算 |
| opts.background | String | canvas背景颜色(如果页面背景颜色不是白色请设置为页面的背景颜色,默认#ffffff) | |
| opts.enableScroll | Boolean | 是否开启图表可拖拽滚动 默认false 支持line, area, column图表类型(需配合绑定@touchstart, @touchmove, @touchend方法) | |
| opts.animation | Boolean | 默认为 true | 是否动画展示 |
| opts.legend | Boolen | 默认为 true | 图例设置,是否显示图表下方各类别的标识 |
| opts.dataLabel | Boolean | 默认为 true | 是否在图表中显示数据标签内容值 |
| opts.dataPointShape | Boolean | 默认为 true | 是否在图表中显示数据点图形标识 |
| opts.disablePieStroke | Boolean | 默认为 false | 不绘制饼图(圆环图)各区块的白色分割线 |
###数据列表每项结构定义
| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
| opts.categories | Array | required | 数据类别(饼图、圆环图不需要) |
opts.categories.value |
Number | 新增参数,仅仪表盘有效,定义仪表盘分段值 |
|
opts.categories.color |
String | 新增参数,仅仪表盘有效,定义仪表盘分段背景颜色 |
|
| opts.series | Array | required | 数据列表 |
| opts.series.data | Array | required | (饼图、圆环图为Number) 数据,如果传入null图表该处出现断点 |
opts.series.data.value |
Number | 新增参数,仅针对柱状图有效,主要作用为柱状图自定义颜色 |
|
opts.series.data.color |
String | 新增参数,仅针对柱状图有效,主要作用为柱状图自定义颜色 |
|
| opts.series.color | String | 例如#7cb5ec 不传入则使用系统默认配色方案 | |
| opts.series.name | String | 数据名称 | |
| opts.series.format | Function | 自定义显示数据内容 |
###标题配置项(适用于ring、arcbar、gauge)
| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
| opts.title | Object | 适用于ring、arcbar、gauge |
|
| opts.title.name | String | 标题内容 | |
| opts.title.fontSize | Number | 标题字体大小(可选,单位为px) | |
| opts.title.color | String | 标题颜色(可选) | |
| opts.title.offsetX | Number | 默认0px | 标题横向位置偏移量,单位px,默认0 |
| opts.title.offsetY | Number | 默认0px | 标题纵向位置偏移量,单位px,默认0 |
| opts.subtitle | Object | 适用于ring、arcbar、gauge |
|
| opts.subtitle.name | String | 副标题内容 | |
| opts.subtitle.offsetX | Number | 默认0px | 副标题横向位置偏移量,单位px,默认0 |
| opts.subtitle.offsetY | Number | 默认0px | 副标题横向位置偏移量,单位px,默认0 |
| opts.subtitle.fontSize | Number | 副标题字体大小(可选,单位为px) | |
| opts.subtitle.color | String | 副标题颜色(可选) |
###坐标轴配置项
| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
| opts.xAxis | Object | X轴配置 | |
opts.xAxis.itemCount |
Number | 默认为 5 | 新增参数,X轴可见区域刻度数量(即X轴数据密度),配合拖拽滚动使用(即仅在启用enableScroll时有效) |
opts.xAxis.scrollShow |
Boolean | 默认为 false | 新增参数,是否显示滚动条,配合拖拽滚动使用(即仅在启用enableScroll时有效) |
opts.xAxis.scrollBackgroundColor |
String | 默认为 #EFEBEF | 新增参数,X轴滚动条背景颜色,配合拖拽滚动使用(即仅在启用enableScroll时有效) |
opts.xAxis.scrollColor |
String | 默认为 #A6A6A6 | 新增参数,X轴滚动条颜色,配合拖拽滚动使用(即仅在启用enableScroll时有效) |
| opts.xAxis.gridColor | String | 默认为 #cccccc | X轴网格颜色 例如#7cb5ec |
| opts.xAxis.fontColor | String | 默认为 #666666 | X轴数据点颜色 例如#7cb5ec |
| opts.xAxis.disableGrid | Boolean | 默认为 false | 不绘制X轴网格 |
opts.xAxis.type |
String | 默认为calibration | X轴网格样式,可选值calibration(刻度)、grid(网格) 默认为包含样式 |
opts.xAxis.gridType |
String | 默认为 solid | X轴网格线型 'solid'为实线、'dash'为虚线 |
opts.xAxis.dashLength |
Number | 默认为 4px | 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.splitNumber |
Number | 默认5 | Y轴网格数量 |
opts.yAxis.gridType |
String | 默认为 solid | Y轴网格线型 'solid'为实线、'dash'为虚线 |
opts.yAxis.dashLength |
Number | 默认为 4px | Y轴网格为虚线时,单段虚线长度 |
| opts.yAxis.gridColor | String | 默认为 solid | Y轴网格颜色 'solid'为实线、''为虚线 |
| opts.yAxis.fontColor | String | 默认为 #666666 | Y轴数据点颜色 例如#7cb5ec |
| opts.yAxis.titleFontColor | String | 默认为 #333333 | Y轴title颜色 例如#7cb5ec |
| opts.yAxis.disabled | Boolean | 默认为 false | 不绘制Y轴 |
###扩展配置项(圆弧进度条)
| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
| opts.extra | Object | 其他非通用配置项 | |
| opts.extra.arcbar | Number | 默认12px | 圆弧进度图相关配置 |
| opts.extra.arcbar.type | String | 默认default | 圆弧进度图样式,default为半圆弧,circle为整圆 |
| opts.extra.arcbar.width | Number | 默认12px | 圆弧进度图弧线宽度,单位为px |
| opts.extra.arcbar.backgroundColor | String | 默认#E9E9E9 | 圆弧进度图背景颜色 |
| opts.extra.arcbar.startAngle | Number | 默认0.75 | 圆弧进度图起始角度,0-2之间,0为3点钟位置,0.5为6点钟,1为9点钟,1.5为12点钟 |
| opts.extra.arcbar.endAngle | Number | 默认0.25 | 圆弧进度图结束角度,0-2之间,0为3点钟位置,0.5为6点钟,1为9点钟,1.5为12点钟 |
###扩展配置项(仪表盘)
| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
| opts.extra.gauge | Object | 仪表盘相关配置 | |
| opts.extra.gauge.type | String | 默认default | 仪表盘样式,default为百度样式,其他样式开发中 |
| opts.extra.gauge.width | Number | 默认15px | 仪表盘坐标轴(指示盘)线宽度,单位为px |
| opts.extra.gauge.labelColor | String | 默认#666666 | 仪表盘刻度尺标签文字颜色 |
| opts.extra.gauge.startAngle | Number | 默认0.75 | 仪表盘起始角度,0-2之间,0为3点钟位置,0.5为6点钟,1为9点钟,1.5为12点钟 |
| opts.extra.gauge.endAngle | Number | 默认0.25 | 仪表盘结束角度,0-2之间,0为3点钟位置,0.5为6点钟,1为9点钟,1.5为12点钟 |
| opts.extra.gauge.startNumber | Number | 默认0 | 仪表盘起始数值 |
| opts.extra.gauge.endNumber | Number | 默认100 | 仪表盘结束数值 |
| opts.extra.gauge.splitLine | Object | 仪表盘刻度线配置 | |
| opts.extra.gauge.splitLine.fixRadius | Number | 默认0 | 仪表盘刻度线径向偏移量 |
| opts.extra.gauge.splitLine.splitNumber | Number | 默认10 | 仪表盘刻度线分段总数量 |
| opts.extra.gauge.splitLine.width | Number | 默认15px | 仪表盘分割线长度 |
| opts.extra.gauge.splitLine.color | String | 默认#FFFFFF | 仪表盘分割线颜色 |
| opts.extra.gauge.splitLine.childNumber | Number | 默认5 | 仪表盘子刻度线数量 |
| opts.extra.gauge.splitLine.childWidth | Number | 默认5px | 仪表盘子刻度线长度 |
| opts.extra.gauge.pointer | Object | 仪表盘指针配置 | |
| opts.extra.gauge.pointer.width | Number | 默认15px | 仪表盘指针宽度 |
| opts.extra.gauge.pointer.color | String | 默认auto | 仪表盘指针颜色,定义为auto时,随仪表盘背景颜色改变,或者可以指定颜色例如'#7cb5ec' |
###扩展配置项(雷达图)
| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
| opts.extra.radar | Object | 雷达图相关配置 | |
| opts.extra.radar.max | Number | 默认为 series | data的最大值,数据区间最大值,用于调整数据显示的比例 |
| opts.extra.radar.labelColor | String | 默认为 #666666 | 各项标识文案的颜色 |
| opts.extra.radar.gridColor | String | 默认为 #cccccc | 雷达图网格颜色 |
###扩展配置项(其他)
| 属性 | 类型 | 默认 | 说明 |
|---|---|---|---|
opts.extra.legendTextColor |
String | 默认为 #cccccc | 图例文案颜色 例如#7cb5ec |
| opts.extra.lineStyle | String | straight | (仅对line, area图表有效) 可选值:curve曲线,straight直线 (default) |
| opts.extra.column | Object | 柱状图相关配置 | |
| opts.extra.column.width | Number | 柱状图每项的图形宽度,单位为px | |
| opts.extra.ringWidth | Number | ringChart圆环宽度,单位为px | |
| opts.extra.pie | Object | 饼图、圆环图相关配置 | |
| opts.extra.pie.offsetAngle | Number | 默认为0 | 起始角度偏移度数,顺时针方向,起点为3点钟位置(比如要设置起点为12点钟位置,即逆时针偏移90度,传入-90即可) |
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
});各位遇到问题请先参考以下问题,如果仍不能解决,请留言。
- 如果用在您的项目上图表不显示,请先运行demo页面,如果demo页面也无法显示,请查看全局样式是否定义了
canvas的样式,如有请取消。 - 如发现实例化图表后,
客户端卡死的状况,请在实例化图表前(即调用showColumn(canvasId,chartData)前)检查传入图表数组(chartData.categories和chartData.series)是否为空,如果为空则不要实例化图表。后续将在源码中解决此问题。 - 图表
背景颜色问题,很多朋友设置图表背景颜色时候,只修改了view和canvas的css,忘记了修改实例化参数中的background:'#FFFFFF',导致图表画板右侧有一道白条(这个是图表配置中的右边距),所以特修改了demo中的柱状图的背景颜色供大家参考。
- 在高分屏模式下,如果发现图表已显示,但位置不正确,请检查上级
view容器的样式,为了解决高分屏canvas模糊问题,使用了css的transform,所以请修改上级样式使canvas容器缩放至相应位置。 - 如果将canvas放在多级组件下,遇到ToolTip不显示或点击区域不正确,请在
touch事件中增加以下代码解决。
//#ifdef H5
e.mp.currentTarget.offsetTop+=uni.upx2px(510);
//#endif
uni.upx2px(510);是canvas组件的上级组件的高度
- 很多小伙伴们自行把本插件做成组件来调用,做成组件需要注意,如果涉及到v-if切换显示图表组件,第二次可能会变空白,这里有两个建议:1、建议用v-show替代v-if切换显示图表组件。2、建议参考demo,不要将canvas做到组件里使用,即直接写在主页面中。












