可视化之根

可视化之根 多年前读过一篇非常震撼的文章,叫《Lisp之根》(英文版:The roots of Lisp),大意是Lisp仅仅通过一种数据结构(列表)和有限的几个函数,就构建出了一门极为简洁,且极具扩展性的编程语言。当时就深深的被这种设计哲学所震撼:一方面它足够简单,每个单独的函数都足够简单,另一方面它有非常复杂,像宏,高阶函数,递归等机制可以构建出任意复杂的程序,而复杂的机制又是由简单的组件组成的。 数据的可视化也是一样,组成一幅内容清晰、表达力强、美观的可视化信息图的也仅仅是一些基本的元素,这些元素的不同组合却可以产生出令人着迷的力量。 要列出“可视化元素之根”很容易:位置、长度、角度、形状、纹理、面积(体积)、色相、饱和度等几种有限的元素,邱南森在他的《数据之美》中提供了一张视觉元素的图,其中包含了大部分常用的元素。 令人振奋的是,这些元素可以自由组合,而且组合旺旺会产生1+1>2的效果。 心理学与认知系统 数据可视化其实是基于人类的视觉认知系统的,因此对人类视觉系统的工作方式有一些了解可以帮助我们设计出更为高效(更快的传递我们想要表达的信息给读者)的可视化作品。 心理物理学 在生活中,我们会遇到这样的场景:一件原价10元的商品,如果降价为5元,则消费者很容易购买;而一件原价100元的商品,降价为95元,则难以刺激消费者产生购买的冲动。这两个打折的绝对数字都是5元,但是效果是不一样的。 韦伯-费希纳定理描述的正是这种非理性的场景。这个定理的一个比较装逼的描述是: 感觉量与物理量的对数值成正比,也就是说,感觉量的增加落后于物理量的增加,物理量成几何级数增长,而心理量成算术级数增长,这个经验公式被称为费希纳定律或韦伯-费希纳定律。 – 摘自百度百科 这个现象由人类的大脑构造而固有,因此在设计可视化作品时也应该充分考虑,比如: 避免使用面积图作为对比 在做对比类图形时,当差异不明显时需要考虑采用非线性的视觉元素 选用多种颜色作为视觉编码时,差异应该足够大 比如: 如上图中,当面积增大之后,肉眼越来越难从形状的大小中解码出实际的数据差异,上边的三组矩形(每行的两个为一组),背后对应的数据如下,可以看到每组中的两个矩形的绝对差都是5: var data = [ {width: 5, height: 5}, {width: 10, height: 10}, {width: 50, height: 50}, {width: 55, height: 55}, {width: 100, height: 100}, {width: 105, height: 105} ]; 格式塔学派 格式塔学派是心理学中的一个重要流派,她强调整体认识,而不是结构主义的组成说。格式塔认为,人类在看到画面时,会优先将其简化为一个整体,然后再细化到每个部分;而不是先识别出各个部分,再拼接为整体。 比如那条著名的斑点狗: 我们的眼睛-大脑可以很容易的看出阴影中的斑点狗,而不是先识别出狗的四条腿或者尾巴(事实上在这张图中,人眼无法识别出各个独立的部分)。 格式塔理论有几个很重要的原理: 接近性原理 相似性原理 封闭性原理 连续性原理 主体/背景原理 当然,格式塔学派后续还有一些发展,总结出了更多的原理。工程上,这些原理还在大量使用,指导设计师设计各式各样的用户界面。鉴于网上已经有众多的格式塔理论及其应用的文章,这里就不在赘述。有兴趣的同学可以参考这几篇文章: 优设上的一篇格式塔文章 优设上的一篇关于格式塔与Web设计的文章 腾讯CDC的一篇格式塔介绍 视觉设计的基本原则 《写给大家看的设计书》一书中,作者用通俗易懂的方式给出了几条设计的基本原则,这些原则完全可以直接用在数据可视化中的设计中:...

March 1, 2017 3 min

新生儿日常记录的可视化 - 星空图

数据来源 从女儿心心出生开始,我们就通过各种方式记录她的各种信息:睡眠记录,吃药记录,体温记录,换尿布记录,哺乳记录等等。毕竟,处于忙乱状态的人们是很难精确地回忆各种数字的,特别是在体检时面对医生的询问时。大部分父母无法准确回答小孩上周平均的睡眠时间,或者平均的小便次数,这在很多时候会影响医生的判断。 我和我老婆的手机上都安装了宝宝生活记录(Baby Tracker)(这里强烈推荐一下,免费版就很好用,不过界面下方有个讨厌的广告,我自己买了无广告的Pro版本),这样心心的每次活动我们都会记录下来,很有意思的是这个APP的数据可以以CSV格式导出(这个太棒了!),而且它自身就可以生成各种的报告,报告还可以以PDF格式导出并发送给其他应用。 有了现实世界中的一组数据 – 我们记录的差不多100天的数据,而且正好我最近在复习D3相关的知识,正好可以用来做一些有趣的练习。 数据准备 从Baby Tracker导出的数据是一些CSV文件组成是压缩包,解压之后大致结果是这样的: 哺乳记录 睡眠记录 换尿布记录 喂药/体温记录 里程碑记录 我就从最简单换尿布数据记录开始吧。我们首先需要将数据做一些清洗和归一化,这样方便前端页面的计算和渲染。数据处理我一般会选择Python+Pandas的组合,只需要写很少的代码就可以完成任务。 python + pandas 原始数据看起来是这样的: name,date,status,note 心心,2016/11/13 17:00,嘘嘘 心心,2016/11/13 19:48,嘘嘘+便便 心心,2016/11/13 22:23,便便 心心,2016/11/14 00:19,便便,一点点,感觉很稀,穿厚点 心心,2016/11/14 04:33,嘘嘘 心心,2016/11/14 09:20,便便 心心,2016/11/14 11:33,便便 心心,2016/11/14 16:14,便便 心心,2016/11/14 21:12,嘘嘘+便便 心心,2016/11/14 23:12,嘘嘘+便便 心心,2016/11/15 00:32,嘘嘘+便便,有点稀 心心,2016/11/15 03:45,干爽 心心,2016/11/15 07:06,嘘嘘 心心,2016/11/15 10:30,嘘嘘+便便 为了方便展示,我需要将数据统计成这样: date,urinate,stool 2016-11-13,2,2 2016-11-14,3,6 2016-11-15,6,8 我不关心每一天不同时刻换尿布的事件本身,只关心每天中,大小便的次数分布,也就是说,我需要这三项数据:日期,当天的小便次数,当天的大便次数。这个用pandas很容易就可以整理出来了,status字段的做一个微小的函数转换(当然可以写的更漂亮,不过在这里不是重点,暂时跳过): import numpy as np import pandas as pd diaper = pd.read_csv('data/diaper_data.csv', usecols=['date', 'status']) diaper['date'] = pd....

February 22, 2017 2 min