这个菜鸟花几个小时写的 DEMO 被码云推荐上首页 ?
写在最前
没有接触过 AntV 的诸位看客可通过这篇不成文的文章稍作了解。最近 病毒猖獗,遂抽空做了一个相关小 DEMO。数据可视化方面的使用的是 AntV F2,前端框架使用 Vue 快速成型,使用与 Vue 配合较好的 Vant 最为UI框架以节约时间。此文以一个小小的示例(渲染能够横向滚动的图表),来填沧海一粟之坑,也算是入门。因为博客园常有神出没,故作此引以节约贵神时间,大神请出门左转。如有雅致对鄙人指点一番亦感激不尽!
思路
通过 Interaction 实现平移,通过 ScrollBar 显示滚动条。
1.Interaction
F2 提供一套交互机制,以达到通用交互行为的封装和复用。基于此机制,我们提供了以下五种通用的交互行为:
- 饼图选中
- 柱状图选中
- 图表平移 pan
- 图表缩放
- 图表 swipe 快扫
2.ScrollBar
Scroll bar 是一个静态插件,主要用于辅助 pan 和 pinch 交互。 滚动条只是为 pan 服务的。
引入 F2
1.使用 ScrollBar 文档中这样写:
const F2 = require('@antv/f2/lib/index');
const ScrollBar = require('@antv/f2/lib/plugin/scroll-bar');
// 注册插件 ScrollBar
F2.Chart.plugins.register(ScrollBar); // 这里进行全局注册,也可以给 chart 的实例注册
// 或者给具体的 chart 实例注册
const chart = new F2.Chart({
id: 'canvas',
plugins: ScrollBar,
});
2.使用 pan 文档中这样写:
const F2 = require('@antv/f2/lib/index'); // 引入 F2
require('@antv/f2/lib/interaction/pan'); // 引入图表平移交互
// ... 创建 chart 实例
// 调用,需要在 chart.render() 方法之前调用
chart.interaction('pan');
接下来你对比我后面的写法, 在vue-cli中要灵活变动,特别是在路径方面。
数据结构
数据结构:
[
{
provinceShortName: "北京",
index: 0,
confirmedCount: 168
},
//...
]
开始
import F2 from "@antv/f2/lib/index";
注意: 需要引入 F2 from 后面的路径,而不是直接 '@antv/f2'。
不成功
- 下面是不成功的例子,如果你不是吃瓜群众,可以直接通过文章目录跳转到 成功
- 为什么要放出来,因为我搞得是柱状图,看官方文档柱状图的 例子 搞的没搞出来。
const originProvinces = ["浙江","广东","台湾","江苏","内蒙古","云南"];
const chart = new F2.Chart({
id: "province-trend",
// plugins: [ScrollBar], 通过 import 引入不需要在这里注册了
pixelRatio: window.devicePixelRatio
});
chart.source(data, {
provinceShortName: {
type: "cat", // 数值类型
tickCount: 5,
values: originProvinces // 对应上面
},
confirmedCount: {
tickCount: 5
}
});
chart
.interval()
.position("provinceShortName*confirmedCount")
.color("provinceShortName");
chart.tooltip({
showItemMarker: true,
background: {
radius: 2,
padding: [3, 5]
},
onShow(ev) {
const items = ev.items;
items[0].name = items[0].title;
items[0].value = items[0].value + " 人";
}
});
chart.interaction("pan");
chart.scrollBar({
xStyle: {
backgroundColor: "#e8e8e8",
fillerColor: "#808080",
offsetY: -2
}
});
chart.render();
- 头部定义
originProvinces通过横坐标定义初始显示的数据,剩余的数据通过滑动显示。 - 可以横向滚动了,但是当横坐标只显示刚开始定义的
originProvinces, 想着动态改变originProvinces,鼓捣半天发现不知道在什么地方触发。如果您知道原因,欢迎指教!
成功
官方还给了另一个个横向滚动的 例子,不过是折线图的,只能硬着头皮上了,仿照官方折线图滚动的例子改成如下:
const chart = new F2.Chart({
id: "province-trend",
pixelRatio: window.devicePixelRatio
});
chart.source(data, {
index: { // 这里横坐标使用 index,
min: 0, // 设置刚开始显示的区间 0-5
max: 5
}
});
chart.tooltip({
showCrosshairs: false,
showItemMarker: false,
background: {
radius: 2,
fill: "#1890FF",
padding: [3, 5]
},
nameStyle: {
fill: "#fff"
},
onShow(ev) {
const items = ev.items;
items[0].name = items[0].title;
}
});
// 这里横坐标应该显示的是 provinceShortName,
// 但是用这种方法必须使用 index 了
// 后面在将横坐标使用类似于起别名的方式改成 provinceShortName
chart.interval().position("index*confirmedCount");
chart
.point()
.position("index*confirmedCount")
.style({
lineWidth: 1,
stroke: "#fff"
});
chart.axis("index", {
label(text) {
return {
fontSize: 14,
// 在这里将横坐标显示为 provinceShortName
text: data[text].provinceShortName
};
}
});
chart.interaction("pan");
chart.scrollBar({
mode: "x",
xStyle: {
offsetY: -5
}
});
chart.render();
这种实现的思路就是不去单独定义刚开始显示的横坐标,而是替换为 index (索引),给它定义一个最初显示的区间。相应的横坐标必须使用 index 了,
但是 index 并不是我们想要显示的横坐标,转换思路,在给它使用类似取别名的方式转换过来就可以了。

大功告成了,这里只放了关键代码,其他细节再优化。 仅仅实现图表滚动,是不是稍微有点麻烦 ?
项目地址
这个菜鸟花几个小时写的 DEMO 被码云推荐上首页 ?的更多相关文章
- 花了2小时写bug
程序员的工作,写bug,修bug,改bug 写了2小时逻辑关系,没写明白 比昨天多了一个返回上一层的功能 也很简单,清除下数组内容即可 emm..明天继续深究吧 dic = { "植物&qu ...
- 我花了 8 小时,"掌握"了一下 Flutter | Flutter 中文站上线
Hi,大家好,我是承香墨影! 距离 Google 在 2018 世界移动大会上发布 Flutter 的 Beta 版本,Flutter 是 Google 用以帮助开发者在 Android 和 iOS ...
- Android菜鸟的成长笔记(6)——剖析源码学自定义主题Theme
原文:Android菜鸟的成长笔记(6)--剖析源码学自定义主题Theme 还记得在Android菜鸟的成长笔记(3)中我们曾经遇到了一个问题吗?"这个界面和真真的QQ界面还有点不同的就是上 ...
- 手写Koa.js源码
用Node.js写一个web服务器,我前面已经写过两篇文章了: 第一篇是不使用任何框架也能搭建一个web服务器,主要是熟悉Node.js原生API的使用:使用Node.js原生API写一个web服务器 ...
- C写的扫描器源码
Title:C写的扫描器源码 --2010-10-27 20:02 无意间看见的一个源代码,弄回来读下. ----------------------------------------------- ...
- Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)
原文:[置顶] Android菜鸟的成长笔记(8)——Intent与Intent Filter(上) Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指 ...
- 实现简单的手写涂鸦板(demo源码)
在一些软件系统中,需要用到手写涂鸦的功能,然后可以将涂鸦的结果保存为图片,并可以将"真迹"通过网络发送给对方.这种手写涂鸦功能是如何实现的了?最直接的,我们可以使用Windows提 ...
- PHP原生代码写的微信扫码支付实例
一款PHP原生代码写的微信扫码支付,不基于任何框架,完全手写. 扫码支付只要授权域名对就OK,本地是无法测试.跟openid也没有关系,所以跟支付授权目录页没关系. 微信商户信息配置地址:weixin ...
- 镜像回源主要用于无缝迁移数据到OSS,即服务已经在自己建立的源站或者在其他云产品上运行,需要迁移到OSS上,但是又不能停止服务,此时可利用镜像回写功能实现。
管理回源设置_管理文件_开发指南_对象存储 OSS-阿里云 https://help.aliyun.com/document_detail/31865.html 通过回源设置,对于获取数据的请求以多种 ...
随机推荐
- java中使用javaMail工具类发送邮件
1.引入依赖 <!--javaMail--> <dependency> <groupId>javax.mail</groupId> <artifa ...
- 20191031-7 beta week 1/2 Scrum立会报告+燃尽图 05
此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9915 git地址:https://e.coding.net/Eusti ...
- kettle高级教程-自动同步
KETTLE4个工作中有用的复杂实例--2.两表数据比较,比较后自动同步(部门.单位数据同步) 二.两表数据比较核对,核对后自动同步至目标数据表 目标:比较t_bm表的数据和t_bm_target表的 ...
- WTM 3.1发布,完美支持.netcore 3.1
在过去的2019年,承蒙各位的厚爱,WTM从零开始一年的时间在GitHub上收获了将近1600星,nuget上的下载量累计超过10万. WTM所坚持的低码开发,快速实现的理念受到了越来越多.netco ...
- Theia APIs——命令和快捷键
上一篇:使用Theia——创建语言支持 命令和快捷键 Theia可以通过多种不同的方式进行扩展.命令允许packages提供可以被其它包调用的唯一命令,还可以向这些命令添加快捷键和上下文,使得它们只能 ...
- 用ES5实现ES6的数组方法map
先举个常见的栗子: var arr = [1,2,3,4,6,7,8,9,12,3,25,63,100] var arr2 = arr.map(item => item += 1) consol ...
- Cassandra数据建模中最重要的事情:主键
Cassandra数据建模中要了解的最重要的事情:主键 使用关系数据建模,您可以从主键开始,但是RDBMS中的有效数据模型更多地是关于表之间的外键关系和关系约束.由于Cassandra无法使用JOIN ...
- java架构之路(多线程)AQS之ReetrantLock显示锁的使用和底层源码解读
说完了我们的synchronized,这次我们来说说我们的显示锁ReetrantLock. 上期回顾: 上次博客我们主要说了锁的分类,synchronized的使用,和synchronized隐式锁的 ...
- Scala实践12
1.内部类和抽象类型成员作为对象成员 内部类 在Scala中,可以让类将其他类作为成员.这些内部类是封闭类的成员.在Scala中,这样的内部类绑定到外部对象.假设希望编译器在编译时阻止我们混合哪些节点 ...
- .NET Core 3 WPF MVVM框架 Prism系列之事件聚合器
本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的使用事件聚合器实现模块间的通信 一.事件聚合器 在上一篇 .NET Core 3 WPF MVVM框架 Prism系列之模块化 ...