2.1 一图胜千言
上一章,我们聊了一些有关"数学 + 艺术"形而上务虚的内容。本章开始介绍如何用Python完成各种可视化的实操内容。
一图胜千言(a picture is worth a thousand words),一说到图片可视化的作用,大家自然而然地会想到这句"陈词滥调"。 但是,并不是所有的图片都"胜千言"。
可能在某些场合中"颜值即正义",但是在数学工具、数据科学、机器学习等应用场景,优质可视化方案不仅仅要读者"眼前一亮"且"言之有物"。
优质可视化方案有助于高效传播信息,在短时间内让读者接收到信息,并促进交流、思考。 有效的图片信息传播应注重高颜值、清晰度、专业性、简洁性、准确性和与读者之间的互动。简而言之,运用之妙,存乎一心, 让读者主动思考的图片才是优质的可视化方案。
反之,低效可视化方案问题可能涉及:信息密度低、信息过载(比如满纸公式)、图像质量差(非矢量、分辨率低)、 设计混乱(中心不明确、分散注意力)、缺乏明确的标签和解释、配色方案失效、缺乏上下文和交互性,以及信息的不准确性(比如手绘高斯函数曲线或曲面)。
一张图片的整个生命周期一般要经过如下几个阶段:
照片也是数据矩阵
鸢尾花照片
| 0.67 | 0.64 | 0.58 |
| 0.62 | 0.55 | 0.51 |
| 0.59 | 0.52 | 0.48 |
数据矩阵 X
照片可以用红、绿、蓝三色组成,这张照片就成了故事链重要的一部分
主成分分析(PCA)图像重建
Original
1 PC
2 PCs
64 PCs
用这幅鸢尾花照片讲解矩阵、主成分分析等
2.2 了解规则:带着枷锁舞蹈
在开始可视化之前,务必明确图片的目标是什么,以及确定图片的受众是谁。 不同的目标和受众可能需要不同类型和风格的可视化呈现。
在这个纸媒和数字媒体共存、共荣的多媒体时代,制作一张图片通常要同时照顾到纸媒、数字媒体的需求。
本书介绍的可视化是在科技制图的范畴之内。因此创作一张图片之前,首先关注制图规则,以便决定图片各种属性。
建议大家在创作图片时考虑以下几个问题:
📐风格与格式
- • 风格是学术专业?还是轻松活泼?
- • 是否允许手绘?
- • 图片大小尺寸?比例如何?
- • 一幅图是否可以多子图?子图布局有何要求?
- • 图片的格式?矢量图,还是像素图?
🔤文字与公式
- • 图片内文字字体(Times New Roman, Arial, Roboto, …)?
- • 文字字号最大、最小几号?文字颜色是否有要求?
- • 图片中的文字是否要求可编辑?
- • 图片中是否可以嵌入公式?
🎨颜色与配色
- • 黑白、彩色?配色有何特殊要求?
- • 是否需要考虑彩色图片在黑白灰打印时呈现效果?
- • 是否需要针对色盲群体调整配色?
- • 颜色采用RGB,还是CMYK?
📊图表细节
- • 图中线宽、线型是否有要求?
- • 是否有必要删除隐藏图层的元素?
- • 图片如果过大,是否可以光栅化(rasterize)?
- • 像素图的像素要求如何?最小、最大像素?
💾文件与交互
- • 图片是否需要单独保存,并提交?
- • 图片文件格式(JPEG、PNG、GIF、SVG、TIFF、PDF ...)、大小是否有要求?
- • 图片是否要用于演示,比如放在PPT中?PPT中的文字大小如何?
- • 是否需要制作动画,比如GIF?
📱用途与媒介
- • 图片是静态,还是交互?
- • 是否考虑创作App应用、dashboard?
- • 正式出版物一般都有专门的制图指南
- • 建议参考《自然》杂志的制图指南
📚 参考资料
如果找不到相关的制图指南,建议大家参考《自然》杂志的制图指南。鸢尾花书在创作时,很多制图细节都参考了《自然》的制图指南。
2.3 头脑风暴:知识网络
富有创意的可视化方案可以为数据插上"翅膀"!根据你要传达的信息和数据的性质,选择适合的图表类型, 从而提高可视化的效果和可读性。
以鸢尾花数据集为起点的知识网络。本书不会介绍这些图背后的数学原理,但是会和大家探讨如何完成这些可视化方案。 这些可视化方案都离不开Python编程实现。
鸢尾花数据表格(Iris Dataset)
| Index | Sepal length (X₁) | Sepal width (X₂) | Petal length (X₃) | Petal width (X₄) | Species |
|---|---|---|---|---|---|
| 1 | 5.1 | 3.5 | 1.4 | 0.2 | Setosa |
| 2 | 4.9 | 3 | 1.4 | 0.2 | Setosa |
| 51 | 7 | 3.2 | 4.7 | 1.4 | Versicolor |
| 52 | 6.4 | 3.2 | 4.5 | 1.5 | Versicolor |
| 101 | 6.3 | 3.3 | 6 | 2.5 | Virginica |
| 150 | 5.9 | 3 | 5.1 | 1.8 | Virginica |
鸢尾花数据表格,单位为厘米(cm)
从鸢尾花数据出发的可视化方案
散点图
展示两个特征之间的关系
成对特征分析图
4×4矩阵展示所有特征组合
太阳爆炸图
层次化展示数据钻取
协方差矩阵热图
特征间相关性可视化
马氏距离等高线
多元高斯分布轮廓
联合概率密度
3D曲面与等高线
协方差椭圆
分类数据的分布形状
后验概率曲面
贝叶斯分类决策边界
回归分析图
线性关系与置信区间
PCA正交系V投影
主成分方向可视化
kNN分类决策边界
分类器决策区域
超椭球三维投影
四维数据的三维切片
鸢尾花前两个特征数据散点图
协方差矩阵和相关性系数矩阵热图
Covariance Matrix
| SL | SW | PL | PW | |
|---|---|---|---|---|
| SL | 0.69 | -0.04 | 1.27 | 0.52 |
| SW | -0.04 | 0.19 | -0.33 | -0.12 |
| PL | 1.27 | -0.33 | 3.11 | 1.30 |
| PW | 0.52 | -0.12 | 1.30 | 0.58 |
Correlation Matrix
| SL | SW | PL | PW | |
|---|---|---|---|---|
| SL | 1.00 | -0.12 | 0.87 | 0.82 |
| SW | -0.12 | 1.00 | -0.43 | -0.37 |
| PL | 0.87 | -0.43 | 1.00 | 0.96 |
| PW | 0.82 | -0.37 | 0.96 | 1.00 |
kNN分类决策边界
k近邻分类,k = 4,采用2个特征(花萼长度x₁和花萼宽度x₂)分类三种鸢尾花
2.4 编程实现:Python有大作为
《可视之美》之所以选择Python作为编程语言,是因为Python提供的是"一站式"解决方案, 也就是说,从数据处理、数学运算,到统计分析、机器学习,乃至本书关注的可视化方案,Python可谓应有尽有、一网打尽。
首先要强调的是,本书每一次使用Python编程完成可视化过程,都离不开数学工具;换个角度来看, 创造各种不同可视化方案来分析同一个数学问题,或同一组数据的过程,都是一次次智力挑战。 在这个过程中,我们不但画出了更有创意的图像,更好地掌握编程技巧;更重要的是,提升了自己的几何思维、数学思维。
请相信,经过你自己手写代码可视化的数学工具,这个数学工具的图像大概率这辈子应该就刻在你脑子里,怕是抹不去了。 当大家实践的越多,见识的数学、编程工具越多,掌握的可视化方案越丰富,就越可能创造出更多更富创意的图像。
Python中常用的可视化工具
Matplotlib
Python中最流行的绑图库之一,提供了广泛的绑图功能,包括折线图、散点图、柱状图、饼图等。 它具有灵活性和广泛的定制选项,可以用于创建静态、交互式和动态的图形。本书大部分的静态矢量图都是用Matplotlib库函数完成。
Seaborn
建立在Matplotlib之上的高级统计数据可视化库。Seaborn提供了一组美观且具有统计意义的图表样式和绑图功能, 使得数据的可视化变得更加简单和直观。
Plotly
一个交互式的可视化库,支持多种图表类型,包括线图、散点图、柱状图、热力图等。 Plotly提供了丰富的交互功能,可以在网页中创建动态和可交互的图形。
ProPlot
本书第5章将简单介绍ProPlot,因为ProPlot出图效果特别类似《自然》等科技期刊。 如果需要用到地图,大家可以使用ProPlot或使用Plotly。
📋 速查表
本书提供一个速查表,用来帮助大家找到合适的可视化方案以及对应的Python函数。 表中,✦ 代表该可视化函数具有交互属性。
2.5 美化完善:优化默认效果
利用Python编程可视化时,利用各种设置美化完善图像是重要的一环。 读过《编程不难》这本书的读者对图16都不陌生。
Anatomy of a Figure - 解剖一幅图
一幅图的基本构成部分包括以下几个部分:
美化完善时,以上组成部分都可以调整以便获得更好的可视化效果。本书下一版块专门介绍如何美化完善图像。
2.6 后期制作:丰富图片细节
后期制作是可视化重要环节之一。以鸢尾花书为例,用Python导出的矢量图不会被直接用到书稿中。 每一幅都至少经过两个软件后期处理之后才会使用。常用的后期制作软件包括: Adobe Illustrator、Adobe Photoshop、Inkscape(免费)、Microsoft Visio等。
为什么需要后期制作?下面给出几个理由:
美学设计
尽管Python库可以生成基本的图表,但在美学设计方面可能有一些限制。使用其他软件,如Adobe Illustrator、Photoshop或Inkscape等,可以提供更多的自定义选项,使图表更专业。
复杂效果
某些特殊效果可能在Python库中难以实现。其他软件通常提供更高级的图形处理功能,这些效果可以为图表增加视觉吸引力。
排版和注释
在生成图表后,可能需要添加额外的注释、标题、图例或其他文本元素;而编程增加这些元素可能耗时耗力,而且效果差、可编辑性差。其他软件通常提供更灵活的排版选项,可以更好地控制这些元素的位置和外观。
合并图表
如果需要将多个图表组合在一起,或者将图表与其他图像、照片或文本元素进行合并,其他软件通常提供更强大的合并和布局功能。
⚠️ 注意
美化修饰没有问题,篡改数据必须坚决杜绝。
2.7 发布传播:到什么山上唱什么歌
经过了解规则、头脑风暴、编程实现、编程美化、后期制作等环节,一幅图算是诞生了,现在就差一步一发布传播媒介。
媒介是指传达信息和知识的工具或方式,它们以形式和技术将信息传递给受众。大家如果现在是通过正式出版图书阅读这段内容, 那么媒介就是纸质。如果大家现在读的是PDF文件,那媒介就是电子书。
以下是一些常见的知识传播媒介:
纸质
传统的知识传播媒介,比如报刊杂志、论文、书籍等等。纸质以印刷的方式将文字和图像展示在纸张上。纸质书具有持久性和便携性的优点,可以在没有电力或网络连接的情况下阅读。
电子书
以电子形式存在的书籍,比如PDF、EPDB、LaTeX等等。电子书可以在电子设备电子终端上阅读。电子书可以通过互联网下载或通过数字媒体载体传递。
幻灯片
通常用于演示和演讲,可以包含文字、图像、图表和动画等内容。
网页
互联网上的文档,使用HTML(超文本标记语言)编写。网页可以包含文本、图像、音频、视频和链接等多种元素,通过浏览器访问。
视频
比如MP4、MOV、GIF等等,是通过捕捉、录制和编辑连续图像帧来呈现动态场景的媒介。特别地,GIF(图形交换格式)支持动画和短视频片段。GIF图像可以通过循环播放一系列图像帧来呈现动画效果。
App应用
提供丰富的交互功能,增强了用户的参与和学习体验。《编程不难》介绍过利用Streamlit制作App应用。
Matplotlib导出的图片格式
Matplotlib可以通过matplotlib.pyplot.savefig()函数保存图片。 下面简单盘点一下最常用的几种图片格式:
基于XML的矢量图形格式,可以无损缩放和编辑,这也是鸢尾花书系列最常用的图片导出格式。
通用的跨平台文档格式,支持矢量图和位图,并能保留图形的高质量,适用于打印、展示和共享。大家如果要用LaTeX写文章,可能会用到这种图片格式。
无损的位图格式,支持透明度和高质量压缩。
常见的有损压缩格式,特别适用于存储和传输照片和复杂图像。注意,JPG/JPEG不支持图像的透明度,这一点没有PNG方便。
基于PostScript语言的矢量图格式,支持高质量的打印输出,常用于出版和印刷领域。Adobe Illustrator可以很轻松地处理EPS格式图形。
此外,Matplotlib还可以生成MP4、GIF格式的视频文件。特别地,Plotly支持交互图形可视化和dashboard搭建。
📌 本章最后给大家提几个建议:
💡 核心洞察
一图胜千言,但优质的可视化不仅仅是"好看",更要"言之有物"。 信息密度、清晰度、专业性、与读者的互动,都是衡量可视化质量的重要指标。
Python有大作为——Matplotlib、Seaborn、Plotly等工具构成了强大的可视化生态系统。 编程实现不仅是画图,更是一次次智力挑战,让数学工具深深刻在脑海中。
从美化完善到后期制作,每一个细节都值得打磨。 理解Figure的anatomy,掌握各个组件的调整方法,配合专业软件进行后期处理。
到什么山上唱什么歌——不同的传播媒介有不同的要求。 纸质、电子书、网页、App,选择合适的格式(SVG、PDF、PNG、JPEG)才能让作品完美呈现。