写在最前

    没有接触过 AntV 的诸位看客可通过这篇不成文的文章稍作了解。最近 病毒猖獗,遂抽空做了一个相关小 DEMO。数据可视化方面的使用的是 AntV F2,前端框架使用 Vue 快速成型,使用与 Vue 配合较好的 Vant 最为UI框架以节约时间。此文以一个小小的示例(渲染能够横向滚动的图表),来填沧海一粟之坑,也算是入门。因为博客园常有神出没,故作此引以节约贵神时间,大神请出门左转。如有雅致对鄙人指点一番亦感激不尽!

思路

通过 Interaction 实现平移,通过 ScrollBar 显示滚动条。

1.Interaction

F2 提供一套交互机制,以达到通用交互行为的封装和复用。基于此机制,我们提供了以下五种通用的交互行为:

  • 饼图选中
  • 柱状图选中
  • 图表平移 pan
  • 图表缩放
  • 图表 swipe 快扫

2.ScrollBar

Scroll bar 是一个静态插件,主要用于辅助 panpinch 交互。 滚动条只是为 pan 服务的。

引入 F2

1.使用 ScrollBar 文档中这样写:

  1. const F2 = require('@antv/f2/lib/index');
  2. const ScrollBar = require('@antv/f2/lib/plugin/scroll-bar');
  3. // 注册插件 ScrollBar
  4. F2.Chart.plugins.register(ScrollBar); // 这里进行全局注册,也可以给 chart 的实例注册
  5. // 或者给具体的 chart 实例注册
  6. const chart = new F2.Chart({
  7. id: 'canvas',
  8. plugins: ScrollBar,
  9. });

2.使用 pan 文档中这样写:

  1. const F2 = require('@antv/f2/lib/index'); // 引入 F2
  2. require('@antv/f2/lib/interaction/pan'); // 引入图表平移交互
  3. // ... 创建 chart 实例
  4. // 调用,需要在 chart.render() 方法之前调用
  5. chart.interaction('pan');

接下来你对比我后面的写法, 在vue-cli中要灵活变动,特别是在路径方面。

数据结构

数据结构:

  1. [
  2. {
  3. provinceShortName: "北京",
  4. index: 0,
  5. confirmedCount: 168
  6. },
  7. //...
  8. ]

开始

  1. import F2 from "@antv/f2/lib/index";

注意: 需要引入 F2 from 后面的路径,而不是直接 '@antv/f2'。

不成功

  1. 下面是不成功的例子,如果你不是吃瓜群众,可以直接通过文章目录跳转到 成功
  2. 为什么要放出来,因为我搞得是柱状图,看官方文档柱状图的 例子 搞的没搞出来。
  1. const originProvinces = ["浙江","广东","台湾","江苏","内蒙古","云南"];
  2. const chart = new F2.Chart({
  3. id: "province-trend",
  4. // plugins: [ScrollBar], 通过 import 引入不需要在这里注册了
  5. pixelRatio: window.devicePixelRatio
  6. });
  7. chart.source(data, {
  8. provinceShortName: {
  9. type: "cat", // 数值类型
  10. tickCount: 5,
  11. values: originProvinces // 对应上面
  12. },
  13. confirmedCount: {
  14. tickCount: 5
  15. }
  16. });
  17. chart
  18. .interval()
  19. .position("provinceShortName*confirmedCount")
  20. .color("provinceShortName");
  21. chart.tooltip({
  22. showItemMarker: true,
  23. background: {
  24. radius: 2,
  25. padding: [3, 5]
  26. },
  27. onShow(ev) {
  28. const items = ev.items;
  29. items[0].name = items[0].title;
  30. items[0].value = items[0].value + " 人";
  31. }
  32. });
  33. chart.interaction("pan");
  34. chart.scrollBar({
  35. xStyle: {
  36. backgroundColor: "#e8e8e8",
  37. fillerColor: "#808080",
  38. offsetY: -2
  39. }
  40. });
  41. chart.render();
  • 头部定义 originProvinces 通过横坐标定义初始显示的数据,剩余的数据通过滑动显示。
  • 可以横向滚动了,但是当横坐标只显示刚开始定义的 originProvinces, 想着动态改变 originProvinces,鼓捣半天发现不知道在什么地方触发。如果您知道原因,欢迎指教!

成功

官方还给了另一个个横向滚动的 例子,不过是折线图的,只能硬着头皮上了,仿照官方折线图滚动的例子改成如下:

  1. const chart = new F2.Chart({
  2. id: "province-trend",
  3. pixelRatio: window.devicePixelRatio
  4. });
  5. chart.source(data, {
  6. index: { // 这里横坐标使用 index,
  7. min: 0, // 设置刚开始显示的区间 0-5
  8. max: 5
  9. }
  10. });
  11. chart.tooltip({
  12. showCrosshairs: false,
  13. showItemMarker: false,
  14. background: {
  15. radius: 2,
  16. fill: "#1890FF",
  17. padding: [3, 5]
  18. },
  19. nameStyle: {
  20. fill: "#fff"
  21. },
  22. onShow(ev) {
  23. const items = ev.items;
  24. items[0].name = items[0].title;
  25. }
  26. });
  27. // 这里横坐标应该显示的是 provinceShortName,
  28. // 但是用这种方法必须使用 index 了
  29. // 后面在将横坐标使用类似于起别名的方式改成 provinceShortName
  30. chart.interval().position("index*confirmedCount");
  31. chart
  32. .point()
  33. .position("index*confirmedCount")
  34. .style({
  35. lineWidth: 1,
  36. stroke: "#fff"
  37. });
  38. chart.axis("index", {
  39. label(text) {
  40. return {
  41. fontSize: 14,
  42. // 在这里将横坐标显示为 provinceShortName
  43. text: data[text].provinceShortName
  44. };
  45. }
  46. });
  47. chart.interaction("pan");
  48. chart.scrollBar({
  49. mode: "x",
  50. xStyle: {
  51. offsetY: -5
  52. }
  53. });
  54. chart.render();

这种实现的思路就是不去单独定义刚开始显示的横坐标,而是替换为 index (索引),给它定义一个最初显示的区间。相应的横坐标必须使用 index 了,

但是 index 并不是我们想要显示的横坐标,转换思路,在给它使用类似取别名的方式转换过来就可以了。

大功告成了,这里只放了关键代码,其他细节再优化。 仅仅实现图表滚动,是不是稍微有点麻烦 ?

项目地址

这个菜鸟花几个小时写的 DEMO 被码云推荐上首页 ?的更多相关文章

  1. 花了2小时写bug

    程序员的工作,写bug,修bug,改bug 写了2小时逻辑关系,没写明白 比昨天多了一个返回上一层的功能 也很简单,清除下数组内容即可 emm..明天继续深究吧 dic = { "植物&qu ...

  2. 我花了 8 小时,"掌握"了一下 Flutter | Flutter 中文站上线

    Hi,大家好,我是承香墨影! 距离 Google 在 2018 世界移动大会上发布 Flutter 的 Beta 版本,Flutter 是 Google 用以帮助开发者在 Android 和 iOS ...

  3. Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme

    原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上 ...

  4. 手写Koa.js源码

    用Node.js写一个web服务器,我前面已经写过两篇文章了: 第一篇是不使用任何框架也能搭建一个web服务器,主要是熟悉Node.js原生API的使用:使用Node.js原生API写一个web服务器 ...

  5. C写的扫描器源码

    Title:C写的扫描器源码 --2010-10-27 20:02 无意间看见的一个源代码,弄回来读下. ----------------------------------------------- ...

  6. Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)

    原文:[置顶] Android菜鸟的成长笔记(8)——Intent与Intent Filter(上) Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指 ...

  7. 实现简单的手写涂鸦板(demo源码)

    在一些软件系统中,需要用到手写涂鸦的功能,然后可以将涂鸦的结果保存为图片,并可以将"真迹"通过网络发送给对方.这种手写涂鸦功能是如何实现的了?最直接的,我们可以使用Windows提 ...

  8. PHP原生代码写的微信扫码支付实例

    一款PHP原生代码写的微信扫码支付,不基于任何框架,完全手写. 扫码支付只要授权域名对就OK,本地是无法测试.跟openid也没有关系,所以跟支付授权目录页没关系. 微信商户信息配置地址:weixin ...

  9. 镜像回源主要用于无缝迁移数据到OSS,即服务已经在自己建立的源站或者在其他云产品上运行,需要迁移到OSS上,但是又不能停止服务,此时可利用镜像回写功能实现。

    管理回源设置_管理文件_开发指南_对象存储 OSS-阿里云 https://help.aliyun.com/document_detail/31865.html 通过回源设置,对于获取数据的请求以多种 ...

随机推荐

  1. 叶子的颜色---经典树上dp

    挺简单的一个dp #include<iostream> #include<cstring> #include<cstdio> #include<algorit ...

  2. c++简单实现循环队列

    栈的数据结构是先进后出,而队列的数据结构就是 一个出口一个入口入口只能入队,出口只能出队 实现的代码如下: /* 循环静态队列实现 2017年8月5日07:50:58 */ #ifndef __QUE ...

  3. llinux重启、用户切换、注销命令

    一.指令 shutdown命令 shutdown -h now //立即关机 shutdown -h 2 //分钟后关机 shutdown -r now //立即重启 shutdown -r 1 // ...

  4. Go 开发关键技术指南 | 敢问路在何方?(内含超全知识大图)

    作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 Go 开发关键技术指南文章目录: 为什么你要选择 Go? Go 面向失败编程 带着服务器编程金刚经走进 2020 年 敢问路在何方? Go 开发指南大图 ...

  5. AcWing 206. 石头游戏 矩阵乘法|矩阵快速幂

    AcWing 206. 石头游戏 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明. 操作序列是一个长度不 ...

  6. 基于redis有序集合,实现简单的延时任务

    基于redis有序集合,实现简单的延时任务 延时任务的场景很多,开发过程中我们经常会遇到,比如说: 1.订单未付款,5分钟后自动取消,这是电商网站非常普遍的需求: 2.用户创建订单不付款,3分钟后自动 ...

  7. Spring Boot2 系列教程 (十七) | 整合 WebSocket 实现聊天室

    微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 昨天那篇介绍了 WebSocket 实现广播,也即服务器端有消息时,将消息发送给所有连接了当前 endpoint 的浏览器.但 ...

  8. 我怎么感觉 ConcurrentDictionary<,> 不是线程安全的喃?

    直接上代码 class Program { static readonly ConcurrentDictionary<string, Person> Dic = new Concurren ...

  9. 图解kubernetes服务打散算法的实现源码

    在分布式调度中为了保证服务的高可用和容灾需求,通常都会讲服务在多个区域.机架.节点上平均分布,从而避免单点故障引起的服务不可用,在k8s中自然也实现了该算法即SelectorSpread, 本文就来学 ...

  10. Web测试中定位bug的方法

    在web测试过程中,经常会遇到页面中内容或数据显示错误,甚至不显示,第一反应就是BUG,没错,确实是BUG.进一步了解这个BUG的问题出在那里,是测试人员需要掌握的,可以简单的使用浏览器自带开发者工具 ...