The Science of Data Visualization: A Primer on the Fund
作者:禅与计算机程序设计艺术
1.简介
数据可视化(Data visualization)是从数据中发现insights并传达给用户的一种方式。许多年来,数据可视化已经成为人们分析、理解和运用数据的一种重要工具。无论是研究领域还是商业领域,数据可视化都扮演着至关重要的角色。
在过去的十几年里,数据可视化一直在蓬勃发展,其潜力已不可估量。但是,对于一些数据可视化专业人员来说,掌握数据可视化背后的科学基础知识将会极大地提高工作效率。本文试图对数据可视化中的基本概念、分析技术、设计技巧等方面进行系统性的介绍。
2.数据可视化的起源
数据可视化的起源可以追溯到19世纪70年代末期左右。当时的科学家们发现某些复杂的数据结构如图像、声音或文本,具有复杂的空间-时间结构。然而,由于这些数据体积庞大且难以理解,科学家们想通过符号表示来简化这种结构。因此,他们开发出了一种基于图形的方法——生动、清晰的图像——来描述这些数据。
另一个重要的影响因素是电脑和互联网的普及。随着人们能够更加便捷地获取和处理海量数据,信息技术和网络技术的发展促进了数据可视化的快速发展。现在,数据可视化已经成为日常生活的一部分,许多企业也在使用数据可视化来帮助决策和洞察数据。
3.数据可视化的目的
数据可视化的目的之一就是使数据更容易被人类理解。它可以用于改善业务决策,增加工作效率,提升产品品质,甚至改变社会意识。
数据可视化的主要任务是从大量的数据中提取有效的信息。数据可视化通常包括三个层次:信息编码、信息重构和信息呈现。
-
信息编码 数据可视化中的第一步是将原始数据转换成图形、影像或其他符号形式。这一阶段涉及到一些数据预处理,例如标准化、归一化和降维等。
-
信息重构 第二步是利用所生成的符号,对原始数据进行重新组合、排序和聚合,以便于查看数据之间的关联。重构阶段需要对数据的统计分析能力、计算机算力和创造力有一定的要求。
-
信息呈现 最后一步是选择最适合的符号和颜色方案来呈现数据。同时,还要考虑数据的可读性、可用性、易用性和美观程度。
4.数据可视化的分类
数据可视化的类型很多,根据其表现形式可以分为:
- 静态图形(Static Graphics):静态图形是指那些不包含动态变化的数据,或者仅仅展示一张图片。典型的静态图形包括散点图、柱状图、条形图等。
- 可交互图形(Interactive Graphics):可交互图形是指基于动态的交互行为,比如点击、悬停、缩放、拖动等,进行数据探索的图形。典型的可交互图形包括柱状图、折线图、气泡图、地图、仪表盘等。
- 动态图形(Animated Graphics):动态图形可以实时反映数据的变化,可以帮助用户更直观地看到数据之间的关联关系。典型的动态图形包括股票图、雷达图、三维图形等。
- 量化图形(Quantitative Graphics):量化图形由数字和图形共同组成,是一种专门用于量化分析的数据可视化方法。典型的量化图形包括柱状图、折线图、饼图、散点图、热力图等。
- 信息图形(Infographic):信息图形是一种简洁、直观、富媒体的方式来呈现复杂的数据。它一般不包含任何计算结果,信息图形的内容主要通过动画、照片、文字等来传递信息。典型的信息图形包括新闻报道、公司宣传册、广告宣传物料等。
5.基本概念术语说明
5.1 数据集(Dataset)
数据集(Dataset)是用来描绘数据的集合。数据集可以是结构化的,也可以是半结构化的。结构化数据是指按照一定的数据模型来组织的数据;半结构化数据则不按照固定的模式来存储数据。例如,电子邮件、日志文件、网页浏览记录、位置数据等都是结构化数据;社交媒体数据、医疗数据、文本数据等都是半结构化数据。
5.2 图元(Element)
图元(Element)是用来表示数据的具体形态,可以是点(Point),线(Line),面(Polygon),或者任意三角形(Triangle)。例如,散点图中的每个点就是一个图元,而折线图中的曲线就是图元。
5.3 属性(Attribute)
属性(Attribute)是用来表示图元的特征,可以是点的大小,颜色,形状,或者值。例如,点集中有多个属性,即代表不同种类的点。
5.4 通用计算语言(UCLC)
通用计算语言(UCLC)是指一种使用图元和属性来对数据进行可视化的方法。它包括了两种语言:基于面向对象的GL(Graphics Library)和基于声明式的VG(Visualization Grammar)。
5.5 主题(Theme)
主题(Theme)是用来描述数据的样式,可以是一个具体的图形风格,也可以是一个抽象的主题描述。例如,气候变化主题下的温度分布图,可以有不同的颜色映射风格,也可以采用轮廓线的方式来突出变化的区域。
5.6 概念图(Conceptual Diagram)
概念图(Conceptual Diagram)是用来表示数据及其关系的图表。它把数据按主题划分成不同的区域,并在不同区域之间建立联系。例如,电影评论情感分析的概念图可能包括主角,配乐,故事情节,票房收入等。
6.核心算法原理和具体操作步骤以及数学公式讲解
数据可视化技术作为一种艺术,其出现的历史较短。许多艺术家认为,数据可视化不是一件神奇的事情,只是用图画出数据。这种看法在一些学科里面得到了认同,例如物理学家都喜欢研究空间和宇宙,所以还有牛顿的著作,哈伯顿说法的出现。
不过,随着近些年数据可视化技术的飞速发展,有些人又认为数据可视化必须具备一些高级的技巧和算法。那么,数据可视化中最基础的概念、术语及其相关的算法原理和操作步骤,以及如何用数学公式来阐述,将会是学界关注的焦点。
6.1 数据映射
数据映射(Data Mapping)是指将原始数据的值映射到图形上,以便于用户更快、更准确地识别数据趋势、比较各项指标。
数据映射的步骤:
- 确定唯一标识符
- 对属性进行编码
- 分组
- 创建图形
- 设置颜色、标记和其他图形元素
- 添加轴标签
- 添加注释
- 添加比例尺
- 将图形元素组合成可视化
- 测试可视化效果
6.1.1 唯一标识符(Unique Identifier)
唯一标识符(Unique Identifier)是指每一条数据都有一个唯一的标识符,可以是数值、字符串、日期时间戳、IP地址等。
6.1.2 属性编码(Encoding Attributes)
属性编码(Encoding Attributes)是指把数据的值映射到图形上的过程。属性编码可以分为离散和连续两种,其中离散数据可以映射到颜色、标记、大小等图形元素上,而连续数据则需要使用连续的图形元素,如散点图、线图、气泡图等。
6.1.3 分组(Grouping)
分组(Grouping)是指把相似的项目放在一起,方便用户对数据进行比较和分析。分组可以按照维度、类型、大小、位置、颜色等进行。
6.1.4 创建图形(Creating Graphics)
创建图形(Creating Graphics)是指选择合适的图形元素,以便于表达原始数据的特征。创建图形可以分为线图、柱状图、饼图、散点图等。
6.1.5 设置颜色、标记和其他图形元素(Setting Colors, Markings, and Other Graphics Elements)
设置颜色、标记和其他图形元素(Setting Colors, Markings, and Other Graphics Elements)是指对图形进行风格化,使用合适的颜色、标记、透明度等方式,让图形变得更富有特色。
6.1.6 添加轴标签(Adding Axis Labels)
添加轴标签(Adding Axis Labels)是指在图表上添加描述性的标签,为读者提供有用的信息。轴标签的数量应当与图表上的图元数量保持一致,以便于用户进行对应。
6.1.7 添加注释(Adding Comments)
添加注释(Adding Comments)是指在图表上添加描述性的注释,以便于呈现更详细的注释信息。注释应该避免与图表元素混淆,否则可能会干扰读者的阅读。
6.1.8 添加比例尺(Adding a Scale Bar)
添加比例尺(Adding a Scale Bar)是指在图表上添加能够反映数据的规模的尺度。尺度栏可以显示图表上每一个坐标轴的刻度单位。
6.1.9 将图形元素组合成可视化(Combining Graphics Elements into Visualizations)
将图形元素组合成可视化(Combining Graphics Elements into Visualizations)是指将之前创建的图形元素组合在一起,生成完整的可视化。
6.1.10 测试可视化效果(Testing Visualization Effectiveness)
测试可视化效果(Testing Visualization Effectiveness)是指检查生成的可视化是否能够满足用户需求,验证可视化的正确性。
6.2 排版布局
排版布局(Layout or Presentation)是指确定数据可视化的外观、排列方式,使其更易于理解和交流。排版布局的步骤:
- 选择合适的图例
- 使用图例进行交叉引用
- 调整字体、字号
- 调整色彩
- 为页面留白
- 决定图的大小
- 选择合适的比例尺
- 添加标题
- 在图表上添加注释
- 生成PDF文档或图像文件
6.2.1 选择合适的图例(Choosing an Appropriate Legend)
选择合适的图例(Choosing an Appropriate Legend)是指选择最恰当的图例,可以帮助用户快速了解数据的概貌,而非单纯的使用颜色来区分。图例的选择应当避免过多的细节,并且易于理解。
6.2.2 使用图例进行交叉引用(Using a Legend for Cross-Referencing)
使用图例进行交叉引用(Using a Legend for Cross-Referencing)是指使用图例来帮助用户找到特定的图元。
6.2.3 调整字体、字号(Adjusting Font Sizes and Types)
调整字体、字号(Adjusting Font Sizes and Types)是指在整个页面上统一调整字体大小,以确保字号符合规范,而且不会违反版权规定。
6.2.4 调整色彩(Adjusting Color Palette)
调整色彩(Adjusting Color Palette)是指根据数据需要,选择不同的色彩搭配,增强数据可视化的独特性。
6.2.5 为页面留白(Providing White Space Around Graphics)
为页面留白(Providing White Space Around Graphics)是指在页面周围留有空白区域,以免影响视觉效果。留白的大小应该根据数据的规模、图形元素的数量、布局的复杂程度等进行调整。
6.2.6 决定图的大小(Determining Size of Charts)
决定图的大小(Determining Size of Charts)是指根据数据量、呈现的对象和布局情况,确定图表的尺寸。图表的大小应该足够大,可以展示更多的信息,而且不能太小,以免无法辨认。
6.2.7 选择合适的比例尺(Selecting a Proper Scale for Charts)
选择合适的比例尺(Selecting a Proper Scale for Charts)是指为图表上的坐标轴添加合适的刻度和标签,能够帮助用户快速理解数据的含义和规模。
6.2.8 添加标题(Adding Title to Charts)
添加标题(Adding Title to Charts)是指为图表添加标题,使其更易于理解。标题可以是图表的名字,也可以是图表的内容的总结。
6.2.9 在图表上添加注释(Annotating Charts with Notes)
在图表上添加注释(Annotating Charts with Notes)是指在图表上添加额外的注释,以便于呈现更详细的说明。注释应该突出重要的部分,并且避免与图表元素混淆,以免影响视觉效果。
6.2.10 生成PDF文档或图像文件(Generating PDF Documents or Images File Formats)
生成PDF文档或图像文件(Generating PDF Documents or Images File Formats)是指生成一份带有高保真度的输出文件,可以分享或打印出来,并配合版式做好准备。
7.具体代码实例和解释说明
为了方便学习和理解,作者将会用Python代码实例说明数据可视化的相关知识点。我们先来看一个简单的例子,根据收入和婚姻状况判断男性和女性的平均收入差距,这是个二维数据可视化的问题。
import pandas as pd
import matplotlib.pyplot as plt
data = {'Gender': ['Male', 'Female'],
'Average Income': [50000, 60000]}
df = pd.DataFrame(data)
plt.barh(y='Gender', width='Average Income', data=df)
plt.title('Average Income Difference Between Male and Female')
plt.xlabel('Average Income')
plt.ylabel('')
plt.show()
代码解读
运行后会生成如下的柱状图:
首先,导入了两个库:pandas 和 matplotlib。
然后,定义了一个字典 data,包含了性别和平均收入两列。
接着,用 pd.DataFrame() 函数将数据转换成 DataFrame 对象。
然后,用 plt.barh 方法画出柱状图。参数 y 表示 y 轴上的变量,width 表示柱的宽度,data 指定数据集。
最后,设置标题、x轴标签、y轴标签,并展示图表。
下面的例子是一个更复杂的数据可视化,用来呈现市场上不同电影类型的销售额排行榜。
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
movies_data = {
'Movie Name': ["The Dark Knight", "Pulp Fiction", "Star Wars", "Inception", "Jurassic Park"],
'Genre': ["Action", "Crime", "Sci-Fi", "Adventure", "Action"],
'Release Year': [2008, 1994, 1977, 2010, 1993],
'Sales (in millions)': [9.3, 3.9, 2.7, 2.7, 2]
}
df = pd.DataFrame(movies_data)
sns.catplot(x="Genre",
y="Sales (in millions)",
hue="Movie Name",
kind="bar",
order=["Action", "Comedy", "Drama", "Sci-Fi"],
data=df)
plt.xticks(rotation=-45)
plt.title("Top Movie Genres Sales in Millions")
plt.xlabel("")
plt.ylabel("Sales (in millions)")
plt.show()
代码解读
运行后,会生成如下的条形图:
这里也用到了 Pandas 和 Seaborn 两个库。
首先,定义了字典 movies_data,包含了电影名称、类型、发行年份和销售额等五列数据。
然后,用 pd.DataFrame() 函数将数据转换成 DataFrame 对象。
接着,用 sns.catplot() 函数画出条形图。参数 x 表示 x 轴上的变量,y 表示 y 轴上的变量,hue 表示颜色变量,kind 表示图的类型,order 表示genre的顺序,data 指定数据集。
最后,设置图例的旋转角度、标题、x轴标签、y轴标签,并展示图表。
