
前言
分形与可视化
“云彩不是球体,山岭不是锥体,海岸线不是圆周,树皮并不光滑,闪电更不是沿直线传播的。”
——《大自然的分形几何》
“在计算机学科的分类中,利用人眼的感知能力对数据进行交互的可视表达以增强认知的技术,称为可视化,它将不可见或难以直接显示的数据转化为可感知的图形、符号、颜色、纹理等,增强数据识别效率,传递有效信息。”
——《数据可视化》
人类有一种与生俱来的“语言天赋”,即无须后天的训练和学习就可以流利地解读图像语言。一份数字化报表,人们需要逐条浏览,才能获知报表所记录的情况,但是柱状图可以让人一眼就知晓所传达的信息。一座城市,道路复杂、河流交错、人群聚居,但是只要一张地图,就可以让人快速了解这座城市的物理空间结构和人群分布。一家大型企业,有很多不同职能的部门,工作的细分程度也很高,但是只要一张组织结构图,就可以让人迅速地明了这家企业的层级关系和职责分工。
人眼是一个视觉信号输入处理器,这个处理器可以同时处理大量的信息,同时它具有很强的模式识别能力,可以快速地,甚至潜意识地解读图形、颜色、纹理等图像符号,解读的速度更是远远大于对数字或文本等形式的感知。正是因为人类视觉的这个特点,从文明初始起,人类便开始通过可视化来进行信息的记录、推理和分析,借助图形和图像来研究、探索和传播万事万物的原理和规律。分形理论的发展也是如此。
分形理论也被称为分形几何、大自然的几何学,它是著名数学家本华·曼德勃罗(法语:Benoît B.Mandelbrot)在1975年构思和发展出来的一种新的几何学。这种几何学完全不同于经典的欧氏几何,它把自然形态看作具有无限嵌套层次的精细结构,这种结构在不同的尺度下保持着某种相似性。也就是说,局部与整体相似,抑或局部是整体的缩影。分形理论既是科学,也是艺术,它的算法巧妙、图形精美,并且蕴含了深刻的自然哲学思想。这种思想根植于传统文化,在近代以科学实证的方式得到了充足的发展,被广泛地应用于各行各业。有兴趣的读者可参看附录A关于分形的介绍。
分形理论在发展的过程中,同样应用了可视化技术。科学家们建立模型,在计算机上进行各种实验,然后将实验数据可视化,并在形成图形和图像的过程中捕获和探索大自然各种形态的奥秘。在本书中,我们将采用Python绘图工具还原分形理论的这些计算机实验及可视化的过程。
Python绘图
Python是一门免费、开源的高级编程语言,有着简洁、易读、灵活、易维护和模块化的优良特性,并且可以轻松地与其他编程语言及软件集成。同时,Python有着丰富的第三方工具库,其中的可视化工具既有基础的Matplotlib,也有复杂的Seaborn、Bokeh,这些工具的使用非常简便,代码可复用、可交互,是实现可视化的强大助力。跟其他数据可视化工具相比,Python的优势如下。
● 对比 Excel。Python 绘图无须按照步骤手工一步一步地操作,而是如同记事本写文章一样,只需要输入几行代码,便可以调用数据,生成各式图表,并且可以复用。Python作为一门编程语言,其绘图更灵活、更自由,可以画出 Excel 不具备的图表及各种特殊效果,比如自定义的可视化交互、动画、颜色渲染等。使用 Excel 最大的局限在于数据量不能太多,一旦数据量过多,计算机内存占用负荷就会升高,图形生成的效率就会降低,从而容易导致错误,但想要找出错误的原因也并不是一件容易的事。Python擅长科学计算,因此更适合对大量数据进行处理和可视化,生成图形的效率也更高,同时,其简洁、清晰的代码风格也使得修改和定位错误更加容易。
● 对比R语言。R语言是一种用于统计分析和绘图的语言,该语言的语法在表面上类似 C 语言,但在语义上是函数设计语言的变种。相比 Python,R 语言更适合科研绘图,其更专业也更难学习。而 Python 是一种代表简单主义思想的语言,其安装配置步骤简单,对于普通人来说,更容易学习和使用。学习Python绘图,只需要熟悉Python的一些基础知识,就能生成各种数据统计图表,并不需要太高的学习成本。
● 对比SAS软件。SAS是由美国North Carolina州立大学于1966年开发的统计分析软件。SAS把数据存取、管理、分析和展现有机地融为了一体。SAS作为一个专业的商业软件,功能强大,统计方法齐、全、新,但是它的安装步骤复杂、价格昂贵,同时也需要用户具备一定的编程基础。对于不需要太复杂的统计分析,只要求对数据进行计算处理并生成常用数据统计图的普通用户来说,使用 SAS 软件的代价实在太高。而 Python 小巧、免费、灵活、多功能,更能符合普通用户的需求。
本书采用的Python工具为Turtle、Matplotlib和NumPy,其中从Turtle模块开始入门,逐步过渡到专业级的 Matplotlib 库和 NumPy 库。Matplotlib 库是比较底层的Python可视化第三方库,有着可定制性强、图表资源丰富、简单易用、达到专业级别的特点。在Python中有许多可用于数据可视化的库,但大多数库都是基于Matplotlib库进行开发封装的,所以,学习Python数据可视化,就必须学习Matplotlib库。Matplotlib库非常灵活,几乎可以生成任何类型的图形,无论是简笔画、艺术图还是数据统计图,都可以完美生成。
本书主要内容
本书采用Turtle、Matplotlib、NumPy这三个Python工具,以分形与计算机图像处理的经典算法为例,通过程序和图像帮助读者一步步地掌握Python绘图和数据可视化的方法和技巧,并且让读者感受到分形的魅力。
本书共分9章,主要内容如下。
第1章:海岸线有多长。采用Python自带的Turtle模块,探讨了海岸线的特点,并用科赫曲线在计算机上模拟了海岸线。这一章是分形和Python绘图的入门章节。
第2章:基因与生成元算法。采用Turtle模块探讨了生成元算法,并分析和展示了多个生成元的实例。
第3章:植物算法之美。从Turtle模块过渡到专业级的Matplotlib绘图库,探讨了L 文法系统,并分析和展示了该系统所生成的多个分形图和植物形态模拟。这一章主要介绍Matplotlib绘图库从安装到具体使用的一系列基础知识。
第4章:凝聚、凝聚、凝聚。采用Matplotlib绘图库和NumPy库,探讨了扩散有限凝聚模型,并分析和展示了多个凝聚体。这一章主要介绍随机数、NumPy 库及Matplotlib库中的几个绘图函数。
第5章:拼贴与显影。采用Matplotlib绘图库和NumPy库,探讨了迭代函数系统,并分析和展示了多个IFS分形图和拼贴图。这一章主要介绍画布上的其他元素:标题、网格、x和y轴标签、刻度、文本、注释、图例等。
第6章:优雅的曲线。采用Matplotlib绘图库和NumPy库,探讨了潜藏在螺旋背后的规律,并分析和展示了多个规律和图形。这一章主要介绍子图、极坐标及 LaTeX排版系统。
第7章:奇异瑰丽的图案。采用Matplotlib绘图库和NumPy库,探讨了曼德勃罗集和朱利亚集,并分析和展示了曼德勃罗图形和多个朱利亚图形。这一章主要介绍网格坐标矩阵和NumPy库的相关函数,以及Matplotlib库的Imshow函数、事件处理和自定义Colormap。
第8章:生命的迭代演化。采用Matplotlib绘图库和NumPy库,探讨了细胞自动机和生命游戏,并分析和展示了多种生命细胞分布图。这一章主要介绍动态演示图像和动画,以及Matplotlib库的Animation模块。
第9章:股票交割单数据可视化案例。这一章包含了一个完整的数据可视化项目案例,给读者提供了一个系统化的参考样本。
配套资源
本书在表述上尽可能地不使用数学公式,书中除截图外的所有图形均由Python编程自动生成。图形的源码均在配套资源各章目录下,源码的下载地址为:http://www.broadview.com.cn/36594。书中使用的源码和数据文件会在相关章节提示读者其文件位置。