手绘风格的数据可视化 Sketchify,让你的图表也萌萌哒
myzbx 2025-05-28 19:14 28 浏览
作者 | naughty
来源 |
oschina.net/taogang/blog/3130390
多少年以前,我在一家BI企业负责数据可视化产品的开发,作为产品创新的需要,一篇论文吸引了我的目光,《Sketchy Rendering for Information Visualization》(
https://hal.inria.fr/hal-00720824/document)(该论文发表于2013年)
于是我带这两个实习生,利用论文中的知识做出了该工具的原型。收到了领导的赞许,就像很多有用和没用的创新一样,这东西最终无疾而终了。
论文的核心是对基本的图形元素的利用随机变形实现手绘风格。例如线和圆:
最近我发现一些手绘风格图表库出现在我的视野,例如chart.xkcd和chartjs-plugin-rough。
chart.xkcd风格很好看,但是支持的图表类型有限。
chartjs-plugin-rough仅仅是chartjs的扩展,使用的范围也很有限。
我希望能有一个通用的工具能够把任意类型的数据可视化转化为手绘风格,于是开发了这个Sketchify。
Sketchify同样是基于Roughjs,Roughjs是是个非常强大的手绘风格基础工具,可以实现基本的绘画元素在Canvas和SVG上的手绘风格的实现。
Skethcify的原理非常简单,从一个给定的根DOM元素开始,找到所有的SVG对象,然后递归寻找所有的子元素,读出子元素的基本属性,利用roughjs创建一个手绘风格的元素拷贝,隐藏原始元素。这样手绘风格的SVG元素就取代了原始的图形。当需要回到初始状态的时候,只要重现所有隐藏的原始元素,移除后加入的手绘元素即可。
代码如下:
const option = { fillStyle: 'hachure', roughness: 1, bowing: 1, chartType: 'highcharts', }; // container is the root dom element that contains related graph svg const handler = Sketchifier(container, option); handler.handify(); // call restore will turn the graph back to original one handler.restore();
我实验了几种常见类型的SVG图表:
- ECharts
- AntV G2
- highcharts
- amcharts
- xCharts
以下是一些演示截图(包含原始数据图和手绘风格的对照):
ECharts
Echart的泡泡图手绘有些问题,这位灵魂画手不太擅长画泡泡。
AntV G2
G2的手绘效果非常好。
highcharts
amcharts with solid fill
xCharts with cross-hatch fill
你也可以到Codepen上去尝试这些例子:
- ECharts
- AntV G2
- highcharts
- amcharts
- xCharts
最后要提一下,手绘风格的字体来自于Google Fonts,选择handwriting类别,能够给出很多好看的手绘风格字体,居然还有中文。Sketchify使用了Indie Flower
提示:
- 该工具仅仅支持以SVG为基础的数据可视化,不支持基于Canvas的库,例如ECharts和Ant G2。
- 手绘风格的处理会引入大量的svg图形元素,可能会消耗大量资源,请量力而为!
如果你喜欢Sketchify,请到Github点赞。
Github:https://github.com/gangtao/sketchify
相关推荐
- 大白话讲nnvm(大白话讲解什么是卷积)
-
之前工作经验中,在某大厂,开发过机器学习框架,在和业务同学的合作下,取得还可以的成绩,但是一直觉得缺少了什么,最近在刷ai-system相关的公开课,才明白计算图的重要性,以往觉得不能理解的东西,现在...
- Python之Json模块详解(python.json()用法)
-
Step1:Json是什么JSON(JavaScriptObjectNotation,JS对象标记)是一种轻量级的数据交换格式。具有数据格式简单,读写方便易懂等很多优点。许多主流的编程语言都...
- 最新潮最流行的影音资源——MAU影视
-
MAO影视,一款完全免费的影视软件,为您带来最新潮最流行的影音资源,软件本身并不具备任何资源,只是作为一款播放器提供给大家。配合相关的接口链接,即可为您呈现丰富多彩的影音节目。软件版本支持:1.安卓2...
- Python版的迷你程序——json文件转换为csv
-
浅话C语言是过去几十年软件和硬件两个阵营之间,签署的最坚实的契约。硬件为C语言的语义提供了最能发挥其性能的基础构件,而软件虽然搞了很多的圆环套圆环般的层次,但最终都以C语言作为最后的沉淀收尾。----...
- 没硬盘、网盘也能看片自由!NAS一键部署MoonTV,随时随地爽看。
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙有没有一个应用服务,能满足既没有足够预算购置硬盘,也不想依托网盘的朋友的家庭观影需求?之前我介绍过LibreTV,本篇再来看看另一个更...
- 用云存储30分钟快速搭建APP,你信吗?
-
背景不管你承认与否,移动互联的时代已经到来,这是一个移动互联的时代,手机已经是当今世界上引领潮流的趋势,大型的全球化企业和中小企业都把APP程序开发纳入到他们的企业发展策略当中。但随着手机APP上传的...
- Python的dict和json区别(python中dict的特点)
-
大家有没有发现,python中的字典类型的数据结构,和我们目前比较流行的web端的json格式,非常类似,几乎有点分不清了。那么这2者的区别是什么呢?首先,从概念上,我们要理解这2者是截然不同的。py...
- 越晚搞懂 MySQL JSON 数据类型,你就越吃亏
-
作者介绍陈臣,甲骨文MySQL首席解决方案工程师,公众号《MySQL实战》作者,有大规模的MySQL,Redis,MongoDB,ES的管理和维护经验,擅长MySQL数据库的性能优化及日常操作的原理剖...
- 揭秘你不会画“信息结构图”的本质
-
编辑导语:产品信息结构图有助于清晰地展示产品信息,一定程度上可以为后台上传数据提供依据,但不少人可能觉得产品信息结构图很难,这可能是对数据库表结构不理解等因素导致的。本篇文章里,作者就产品信息结构图的...
- python之json基本操作(.json python)
-
1.概述JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它具有简洁、清晰的层次结构,易于阅读和编写,还可以有效的提升网络传输效率。Python标准库的...
- JWT 和 JJWT 还傻傻的分不清吗(jwt jti)
-
JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成,其中名称为字符串,值为任意JSON值。JWT有助于在clear(例如在URL中)发送这样的信息,可以被信任为不可读(即加密的)、...
- 比json快20-100倍!protobuf原理深入剖析
-
一、protobuf语法指南1.1定义一个消息类型先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结...
- 了解一下ProtoBuf(了解一下相亲对象的年龄)
-
序列化与反序列化我们在进行网络通信调用的时候,总是需要将内存的数据块经过序列化,转换成为一种可以通过网络流进行传输的格式。而这种格式在经过了传输之后再经过序列化,能还原成我们预想中的数据结构。那么我们...
- JSON数据类型详细总结(json数据类型详细总结怎么写)
-
JSON详解一、JSON的概述及其使用JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。它基于javascript的一个子集。JSON是的数据交换语言,易...
- 接口自动化测试之JSON Schema模式该如何使用?
-
JSONSchema模式是一个词汇表,可用于注释和验证JSON文档。在实际工作中,对接口返回值进行断言校验,除了常用字段的断言检测以外,还要对其他字段的类型进行检测。对返回的字段一个个写断言显...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)