在学习完了《Python编程:从入门到实践》的第一个项目“外星人入侵”后,我来到了第二个项目:“数据可视化”,而这个项目我将在Mac OS X系统中用Sublime Text来完成。
1.1 安装matplotlib:
Apple的标准Python安装自带了matplotlib。要检查系统是否安装了matplotlib,可打开一个终端会话并尝试导入matplotlib,如下图所示:
如果没有出现任何错误消息,就说明系统已经安装了matplotlib。
1.2 绘制简单的散点图:
下面来使用matplotlib绘制一个简单的折线图,再对其进行定制,以实现信息更丰富的数据可视化。我们将使用平方数序列1、4、9、16和25来绘制这个图表。 只需向matplotlib提供如下数字,matplotlib就能完成其他的工作:
import matplotlib.pyplot as pltsquares = [1, 4, 9, 16, 25]plt.plot(squares)plt.show()
我们首先导入了模块
pyplot
,并给它指定了别名\”plt\” ,以免反复输入。模块
pyplot
包含很多用于生成图表的函数。 我们创建了一个列表,在其中存储了前述平方数,再将这个列表传递给函数
plot()
,这个函数尝试根据这些数字绘制出有意义的图形。
plt.show()
打开matplotlib查看器,并显示绘制的图形,如下图所示。查看器让你能够缩放和导航图形,另外,单击磁盘图标可将图形保存起来:
上图所示的图形表明数字是越来越大的,但标签文字太小,线条太细。但matplotlib能够调整可视化的各个方面。下面通过一些定制来改善这个图形的可读性,如下所示:
# -*- coding:utf-8 -*-import matplotlib.pyplot as pltsquares = [1, 4, 9, 16, 25]plt.plot(squares, linewidth=5)#设置图表标题,并给坐标轴加上标签及字体大小plt.title(\'Square number\',fontsize = 25)plt.xlabel(\'Value\',fontsize = 25)plt.ylabel(\'Square of value\',fontsize = 15)#设置刻度标记的大小plt.tick_params(axis=\'both\',labelsize = 15)plt.show()
参数
linewidth
(见第5行)决定了
plot()
绘制的线条的粗细。
函数
title()
(见第8行)给图表指定标题。
在上述代码中,出现了多次的参数
fontsize
指定了图表中文字的大小。
函数
xlabel()
和
ylabel()
让你能够为每条轴设置标题(见第9-10行)。
而函数
tick_params()
设置刻度的样式(见第13行),其中指定的实参将影响x轴和y轴上的刻度 (
axes=\'both\'
),并将刻度标记的字号设置为14(
labelsize=15
)。
最终的图表如下图所示:
图形更容易阅读后,我们发现这张图没有正确地绘制数据。下面来修复这个问题。 当向
plot()
提供一系列数字时,它假设第一个数据点对应的 x 坐标值为0,但实际上我们的第一个点对应的 x 值为1。为改变这种默认行为,我们可以如下图所示给
plot()
同时提供输入值和输出值:
现在
plot()
将正确地绘制数据,因为我们同时提供了输入值和输出值,它无需对输出值的生成方式作出假设。最终的图形是正确的,如下图所示:
1.3 使用scatter()绘制散点图并设置其样式:
有时候,需要绘制散点图并设置各个数据点的样式。要绘制单个点,可使用函数
scatter()
,并向它传递一对 x 和 y 坐标,它将在指定位置绘制一个点:
在第4行处,我们调用了
scatter()
,并使用实参
s
设置了绘制图形时使用的点的尺寸。如果此时运行scatter_squares.py,将在图表中央看到一个点,如下图所示:
要绘制一系列的点,可向
scatter()
传递两个分别包含 x 值和 y 值的列表,如下所示:
列表
x_values
包含要计算其平方值的数字,而列表
y_values
包含前述每个数字的平方值。将这些列表传递给
scatter()
。最终的结果如图所示:
此外,我们可以不必手工计算包含点坐标的列表,而让Python循环来替我们完成这种计算。下面是让程序自动绘制1000个点的代码:
我们首先创建了一个包含 x 值的列表,其中包含数字1~1001(见第5行)。接下来是一个生成 y 值的列表解析,它遍历 x 值(
for x in x_values
),计算其平方值(
x**2
), 并将结果存储到列表
y_values
中。
然后,将输入列表和输出列表传递给
scatter()
(见第7行)。 由于这个数据集较大,需要将点设置得较小,并使用函数
axis()
指定了每个坐标轴的取值范围(见第15行)。函数
axis()
要求提供四个值:x 和 y 坐标轴的最小值和最大值。在这里,我们将 x 坐标轴的取值范围设置为1~1001,并将 y 坐标轴的取值范围设置为1~1000000。结果如图所示: