2021SC@SDUSC“F2移动端可视化方案”源码分析(九)——小程序与Node端上的F2渲染

2021SC@SDUSC

目录

简介

Node端渲染F2

使用说明

步骤

 高清适配

小程序上渲染F2

封装思路

支付宝小程序

微信小程序


简介

本文主要用来分析F2在两个常用端上的渲染使用。

F2 是基于 CanvasRenderingContext2D 的标准接口绘制的,所以只要能提供标准 CanvasRenderingContext2D 接口的实现对象,F2就能进行图表绘制.

Node端渲染F2

使用说明

将F2运行于 Node 的后台服务上面,可以提供相当强大的服务端渲染可视化图表的能力,可以用于生成离线报表、图文 pdf 等场景。

步骤

1.安装 node-canvas

该模块提供了在 node 中实现 canvas 渲染的能力,结合该模块,就可以实现 F2 在 node 端的图表渲染了

npm install canvas

2.引入F2

const F2 = require('@antv/f2');

3.创建一个 canvas 对象

const Canvas = require('canvas');
const canvas = Canvas.createCanvas(400,267);

4.使用 F2 绘制图表,需要注意的是,在创建 Chart 对象时传入的属性,下面的两种方式 width 和 height 属性都是必须设置的,在这里需要说明的是,动画模块,F2 会默认引入,所以在 node 端需要把动画给关掉,不然会出现渲染不完整的情况。

// 传入上下文环境
const chart = new F2.Chart({
    context: canvas.getContext('2d'), // 将第三步创建的 canvas 对象的上下文传入
    width: 400, // 必选,图表高度,跟 canvas 的宽度相同
    height: 267, // 必选,图表高度,跟 canvas 的高度相同
    animate: false // 关闭动画
});

 下面给出一个 F2 在 Node 端绘制饼图的一个完整代码:

const fs = require('fs');
const path = require('path');
const Canvas = require('canvas'); // 引入 node canvas
const F2 = require('@antv/f2');

const canvas = Canvas.createCanvas(375, 260); // 创建 canvas 对象

// 使用 F2 绘制饼图
const data = [
  { name: '芳华', percent: 0.4, a: '1' },
  { name: '妖猫传', percent: 0.2, a: '1' },
  { name: '机器之血', percent: 0.18, a: '1' },
  { name: '心理罪', percent: 0.15, a: '1' },
  { name: '寻梦环游记', percent: 0.05, a: '1' },
  { name: '其他', percent: 0.02, a: '1' }
];
const chart = new F2.Chart({
  context: canvas.getContext('2d'),
  width: 375,
  height: 260,
  animate: false,
  padding: [ 45, 'auto', 'auto' ]
});
chart.source(data, {
  percent: {
    formatter(val) {
      return val * 100 + '%';
    }
  }
});
chart.legend({
  position: 'right'
});
chart.coord('polar', {
  transposed: true,
  radius: 0.85
});
chart.axis(false);
chart.interval()
  .position('a*percent')
  .color('name', [ '#1890FF', '#13C2C2', '#2FC25B', '#FACC14', '#F04864', '#8543E0' ])
  .adjust('stack')
  .style({
    lineWidth: 1,
    stroke: '#fff',
    lineJoin: 'round',
    lineCap: 'round'
  });

chart.render();

canvas.createPNGStream().pipe(fs.createWriteStream(path.join(__dirname, 'pie.png'))) // 导出图片

效果图:

 高清适配

这个地方是比较简单的,假设我们当前的设备的像素比为 n ,只需要把宽和高都放大 n 倍即可:

const canvas = Canvas.createCanvas(375 * n, 260 * n); // create a canvas object
const chart = new F2.Chart({
    el: canvas,
    width: 375 * n,
    height: 260 * n,
    padding: [ 45, 'auto','auto'],
});

小程序上渲染F2

封装思路

因为在小程序中所给的 context 对象不是标准的 CanvasRenderingContext2D ,所以封装的核心思路是将 CanvasRenderingContext2D 对齐,所以 F2 针对支付宝和微信这两个常见的场景做了一层  context 的对齐,其他的小程序也可以按同样的思路封装。

支付宝小程序

说明

为了方便用户使用,F2 封装了小程序的自定义组件,所以需要支付宝小程序基础库支持自定义组件:小程序基础库版本要在 1.7.0 或以上。

使用

1.安装依赖

项目默认初始化后是没有 package.json 的,需要新增 package.json 后再安装

npm install @antv/my-f2 --save

2.使用自定义组件

1)打开json文件,引入组件

{
    "usingComponents": {
        "f2": "@antv/my-f2"
    }
}

2)axml使用组件

<view class = "f2-chart">
    <f2 onInit = "onInitChart"></f2>
</view>

3)acss设置宽高

.f2-chart {
    width: 100%;
    height: 500rpx;
}

4)实例化图表格

Page({
  data: {},
  onInitChart(F2, config) {
    const chart = new F2.Chart(config);
    const data = [
      { value: 63.4, city: 'New York', date: '2011-10-01' },
      { value: 62.7, city: 'Alaska', date: '2011-10-01' },
      { value: 72.2, city: 'Austin', date: '2011-10-01' },
      { value: 58, city: 'New York', date: '2011-10-02' },
      { value: 59.9, city: 'Alaska', date: '2011-10-02' },
      { value: 67.7, city: 'Austin', date: '2011-10-02' },
      { value: 53.3, city: 'New York', date: '2011-10-03' },
      { value: 59.1, city: 'Alaska', date: '2011-10-03' },
      { value: 69.4, city: 'Austin', date: '2011-10-03' },
    ];
    chart.source(data, {
      date: {
        range: [0, 1],
        type: 'timeCat',
        mask: 'MM-DD'
      },
      value: {
        max: 300,
        tickCount: 4
      }
    });
    chart.area().position('date*value').color('city').adjust('stack');
    chart.line().position('date*value').color('city').adjust('stack');
    chart.render();
    // 注意:需要把chart return 出来
    return chart;
  }
});

微信小程序

微信小程序的 F2 渲染方式与支付宝相似,在此不做进一步分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值