多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 线形图 线形图是最基础的图形,其实现类为`WxLiner`。WxLiner支持基础线形图,区域线形图等几种绘图展示形式。 ## <span id="init">简单实例</span> 如果要使用线形图,则需要引用 `WxLiner` 并初始化一个图形库。在[基础](base.md)章节,我们了解到所有的图形,首个参数为图形所使用的的Canvas画布的id(或微信小程序中的canvas-id)或者HTMLElement节点。第二个参数为图形实例的详细设置项。 让我们做一个最简单的例子: ![](https://box.kancloud.cn/5319fd58d27b88b5ac3e30fa74a5dad3_1423x805.png) ```js import { WxLiner } from 'wx-chart'; let wxLiner = new WxLiner('myCanvas', { width: 700, height: 400, title: '北京分公司业务销量趋势图', yScaleOptions: { position: 'left', title: '人民币(万)' }, legends:[{ text: '销售额' }] }); wxLiner.update([{ value: 1, label: '一月' }, { value: 40, label: '二月' }, { value: 35, label: '三月' }, { value: 56, label: '四月' }, { value: 71, label: '五月' }]); ``` 在上面的例子中,我们绘制了一个最简单的线形图,描述了某公司近5个月的总销售额。可以看到,线性图的设置都比较易懂。 唯一值得注意的有两点。第一,由于我们没有设置线状图的颜色,所以系统会自动分配一个颜色;其二,如果感觉一条曲线没有必要画图例的话,你可以在图形中增加以下配置: ```js legendOptions:{ display: false } ``` 但是,**必须**保留`legends`的配置,该配置用于唯一标识图形的每根线。 ## <span id="init">多图例</span> 当需要绘制多个线条时,你只需要基于上面的例子,多增加几项配置;一是在`legends`增加你新增的线条标识,二是在数据中根据你的标识增加相应的值。 让我们看一个稍微复杂一点的多线条图的实例 ![](https://box.kancloud.cn/7c53c36ab0b563643003dd9e12488ba5_1441x817.png) ```js import { WxLiner } from 'wx-chart'; let wxLiner = new WxLiner('myCanvas', { width: 700, height: 400, title: '北京-上海分公司业务销量对比', yScaleOptions: { position: 'left', title: '人民币(万)' }, legends:[{ text: '北京', key: 'bj', fillStyle: '#3385ff', strokeStyle: '#3385ff' }, { text: '上海', key: 'sh', }] }); wxLiner.update([{ bj: 10, sh: 20, label: '一月' }, { bj: 40, sh: 115, label: '二月' }, { bj: 35, sh: 34.5, label: '三月' }, { bj: 56, sh: 22, label: '四月' }, { bj: 71, sh: 56, label: '五月' }]); ``` 上面的多线条实例中,我们可以看出,我们在`legends`设置中定义了“北京”与“上海”两个线条图例,并且还单独设置了北京的图例颜色(简单学习过Canvas的同学应该了解,fillStyle为填充颜色,strokeStyle为线条颜色); 需要注意的是我们的更新的数据,我们的数据并不像单线条那样使用默认的key值: `value` ,来代表数值,而是在`legends`设置中自定义了key值:`bj` 和 `sh`。 ## <span id="init">应对数据缺失</span> 在我们绘制复杂线形图时,有可能会有某一个节点数据缺失。一般来说,我们会有两种方法来应对:断开曲线 或者 假装补齐。 WxLine通过`spanGaps`来支持这两种方式,默认的`spanGaps`的值为`false`,即断开曲线。我们来看下两者的差别。 ![](https://box.kancloud.cn/b332f1dff1cd668f9bf4afb40548f036_1424x815.png =500x280) ```js let wxLiner = new WxLiner('myCanvas', { ... legends:[{ text: '北京', key: 'bj', fillStyle: '#3385ff', strokeStyle: '#3385ff' }, { text: '上海', key: 'sh', // spanGaps : false //默认的 }] }); ``` ![](https://box.kancloud.cn/472b68b4b339696313096b6c3007c0ff_1439x813.png =500x280) ```js let wxLiner = new WxLiner('myCanvas', { ... legends:[{ text: '北京', key: 'bj', fillStyle: '#3385ff', strokeStyle: '#3385ff' }, { text: '上海', key: 'sh', spanGaps : true }] }); ``` ## <span id="init">起始点?</span> 上面的例子中,你会发现我们的X轴起始点不在顶点,有时候感觉这很变扭。我们可以通过在图形中增加 ```js crossScaleOptions: { xFirstPointSpace: 0 } ``` 这项设置来将起始点变为顶点。(注:这其实是[区域组件-交叉轴](component.md#crossScale)中的一个设置项) ## <span id="fillArea">填充线形图</span> 为了让我的图形变的更好看,我们可以在`legends`设置`fillArea`属性,这个属性会用颜色填充X轴与线图之间的空隙。像下图所示: ![](https://box.kancloud.cn/9a4e370079d0f2a77bbb0ffd5f9444dc_1454x811.png) ```js let wxLiner = new WxLiner('myCanvas', { width: 700, height: 400, title: '北京-上海分公司业务销量对比', crossScaleOptions: { 'xFirstPointSpace': 0 }, yScaleOptions: { position: 'left', title: '人民币(万)' }, legends:[{ text: '北京', key: 'bj', fillStyle: '#3385ff', strokeStyle: '#3385ff', fillArea: true }, { text: '上海', key: 'sh', fillArea: true }] }); ``` ## <span id="stacked">堆栈线形图</span> 像其他图形库一样,wxChart也支持堆栈式线图形。在图形中设置 `stacked:true` 即得到一个线性的堆栈图形。如下所示: ![](https://box.kancloud.cn/0f72a23b82f314b47a56d2e8f146e54c_1423x819.png) 需要注意的是,堆栈图是在 0 届两端分别累加的,例如上图第一点数据为: ```js { bj: -20, sh: 20, label: '一月' } ``` 你会发现一月的的数值累加为0(20 + (-20) = 0),但是栈式图形描绘了0界上下各两个点。这与[柱状图](bar.md)中的堆栈式图逻辑保持一致。 在某些需求中,你需要**去除负值**(例如:上图中北京销售量值为负明显就是错误数据)。你可以设置`discardNeg: true`来在绘制堆栈式图时使负值归零。 ## <span id="smooth">线形图平滑</span> 默认的,线形图两点之间会进行平滑处理,原理可参见Rob Spencer, 2010的文章[Spline Interpolation](http://scaledinnovation.com/analytics/splines/aboutSplines.html)。如果需要关闭平滑处理,你需要将每一个`legend`中的`tension`值设置为0。 ![](https://box.kancloud.cn/088355bce835272cb8abbd8b53d2f2b5_1386x810.png) ```js let wxLiner = new WxLiner('myCanvas', { ..., legends:[{ text: '北京', key: 'bj', fillArea: true, tension: 0 }, { text: '上海', key: 'sh', fillArea: true }] }); ```