在基因研究、天气研究、政治经济分析等众多领域,大家都使用Python来完成数据密集型
工作。数据科学家使用Python编写了一系列令人印象深刻的可视化和分析工具,其中很多也可
供你使用。最流行的工具之一是matplotlib,它是一个数学绘图库,我们将使用它来制作简单
的图表,如折线图和散点图。然后,我们将基于随机漫步概念生成一个更有趣的数据集——
根据一系列随机决策生成的图表。
我们还将使用Pygal包,它专注于生成适合在数字设备上显示的图表。通过使用Pygal,
可在用户与图表交互时突出元素以及调整其大小,还可轻松地调整整个图表的尺寸,使其适
合在微型智能手表或巨型显示器上显示。我们将使用Pygal以各种方式探索掷骰子的结果。
1.安装 matplotlib
1.1 Linux系统中安装
如果你使用的是系统自带的Python版本,可使用系统的包管理器来安装matplotlib,为此只需
执行一行命令:
$ sudo yum install python3-matplotlib
如果你使用的是Python 2.7,请执行如下命令:
$ sudo apt-get install python-matplotlib
如果你安装了较新的Python版本,就必须安装matplotlib依赖的一些库:
$ sudo apt-get install python3.5-dev python3.5-tk tk-dev
$ sudo apt-get install libfreetype6-dev g++
再使用pip来安装matplotlib:
$ pip install --user matplotlib
1.2 OS X系统中安装
Apple的标准Python安装自带了matplotlib。要检查系统是否安装了matplotlib,可打开一个终
端会话并尝试导入matplotlib。如果系统没有自带matplotlib,且你的Python是使用Homebrew安装
的,则可以像下面这样安装matplotlib:
$ pip install --user matplotlib
注意 安装包时可能需要使用
pip3
,而不是
pip
。另外,如果这个命令不管用,你可能需要删除
标志
--user
。
1.3 Windows系统中安装
使用pip安装
1.4 测试matplotlib是否安装成功
使用命令ipython启动一个终端会话,再导入 matplotlib: 如果没有出现任何错误消息,就说明你的系统安装了matplotlib
In [1]: import matplotlib as plt
In [2]:
1.5 matplotlib 画廊
要查看使用matplotlib可制作的各种图表,请访问 http://matplotlib.org/的示例画廊。单击画廊中的图表,就可查看用于生成图表的代码。
2. 绘制简单的折线图
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
plt.plot(squares)
plt.show()
我们首先导入了模块pyplot,并给它指定了别名plt,以免反复输入pyplot。在线示例大都这样做,因此这里也这样做。模块pyplot包含很多用于生成图表的函数。
我们创建了一个列表,在其中存储了前述平方数,再将这个列表传递给函数plot(),这个函数尝试根据这些数字绘制出有意义的图形。 plt.show()打开matplotlib查看器,并显示绘制的图形,如图所示。查看器让你能够缩放和导航图形,另外,单击磁盘图标可将图形保存起来。
2.1 修改标签文字和线条粗细
通过一些定制来改善这个图形的可读性,如下所示:
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
①plt.plot(squares, linewidth=5)
# 设置图表标题,并给坐标轴加上标签
②plt.title("Square Numbers", fontsize=24)
③plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
④plt.tick_params(axis='both', labelsize=14)
plt.show()
参数linewidth(见①)决定了plot()绘制的线条的粗细。函数title()(见②)给图表指定标题。在上述代码中,出现了多次的参数fontsize指定了图表中文字的大小。
函数xlabel()和ylabel()让你能够为每条轴设置标题(见③);而函数tick_params()设置刻度的样式(见④),其中指定的实参将影响x轴和y轴上的刻度( axes='both'),并将刻度标记的字号设置为14( labelsize=14)。
最终的图表阅读起来容易得多了,如图所示:标签文字更大,线条也更粗。
2.2 校正图形
图形更容易阅读后,我们发现没有正确地绘制数据:折线图的终点指出4.0的平方为25!下面来修复这个问题。
当你向plot()提供一系列数字时,它假设第一个数据点对应的x坐标值为0,但我们的第一个点对应的x值为1。为改变这种默认行为,我们可以给plot()同时提供输入值和输出值:
import matplotlib.pyplot as plt
input_values = [1, 2, 3, 4, 5]
squares = [1, 4, 9, 16, 25]
plt.plot(input_values, squares, linewidth=5)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', labelsize=14)
plt.show()
2.3 使用 scatter()绘制散点图并设置其样式
有时候,需要绘制散点图并设置各个数据点的样式。例如,你可能想以一种颜色显示较小的值,而用另一种颜色显示较大的值。绘制大型数据集时,你还可以对每个点都设置同样的样式,再使用不同的样式选项重新绘制某些点,以突出它们。
要绘制单个点,可使用函数scatter(),并向它传递一对x和y坐标,它将在指定位置绘制一个点:
import matplotlib.pyplot as plt
plt.scatter(2, 4)
plt.show()
下面来设置输出的样式,使其更有趣:添加标题,给轴加上标签,并确保所有文本都大到能够看清:
import matplotlib.pyplot as plt
①plt.scatter(2, 4, s=200)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()
在①处,我们调用了scatter(),并使用实参s设置了绘制图形时使用的点的尺寸。如果此时运行scatter_squares.py,将在图表中央看到一个点,如图所示。
2.4 使用 scatter()绘制一系列点
要绘制一系列的点,可向scatter()传递两个分别包含x值和y值的列表,如下所示:
import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5]
y_values = [1, 4, 9, 16, 25]
plt.scatter(x_values, y_values, s=100)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
plt.show()
列表x_values包含要计算其平方值的数字,而列表y_values包含前述每个数字的平方值。将这些列表传递给scatter()时, matplotlib依次从每个列表中读取一个值来绘制一个点。要绘制的点的坐标分别为
(1, 1)、
(2, 4)、
(3, 9)、
(4, 16)和
(5, 25),最终的结果如图所示。
2.5 自动计算数据
手工计算列表要包含的值可能效率低下,需要绘制的点很多时尤其如此。可以不必手工计算包含点坐标的列表,而让Python循环来替我们完成这种计算。下面是绘制1000个点的代码:
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, s=40)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
# 设置每个坐标轴的取值范围
①plt.axis([0, 1100, 0, 1100000])
plt.show()
由于这个数据集较大,我们将点设置得较小,并使用函数axis()指定了每个坐标轴的取值范围(见①)。函数axis()要求提供四个值: x和y坐标轴的最小值和最大值。在这里,我们将x坐标轴的取值范围设置为0~1100,并将y坐标轴的取值范围设置为0~1 100 000。结果如图所示。
2.6 删除数据点的轮廓
matplotlib允许你给散点图中的各个点指定颜色。默认为蓝色点和黑色轮廓,在散点图包含的数据点不多时效果很好。但绘制很多点时,黑色轮廓可能会粘连在一起。要删除数据点的轮廓,可在调用scatter()时传递实参edgecolor='none':
plt.scatter(x_values, y_values, edgecolor='none', s=40)
2.7 自定义颜色
要修改数据点的颜色,可向scatter()传递参数c,并将其设置为要使用的颜色的名称,如下所示:
plt.scatter(x_values, y_values, c='red', edgecolor='none', s=40)
你还可以使用RGB颜色模式自定义颜色。要指定自定义颜色,可传递参数c,并将其设置为 一个元组,其中包含三个0~1之间的小数值,它们分别表示红色、绿色和蓝色分量。例如,下面的代码行创建一个由淡蓝色点组成的散点图:
plt.scatter(x_values, y_values, c=(0, 0, 0.8), edgecolor='none', s=40)
值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅。
2.8 使用颜色映射
颜色映射( colormap)是一系列颜色,它们从起始颜色渐变到结束颜色。在可视化中,颜色映射用于突出数据的规律,例如,你可能用较浅的颜色来显示较小的值,并使用较深的颜色来显示较大的值。
模块pyplot内置了一组颜色映射。要使用这些颜色映射,你需要告诉pyplot该如何设置数据集中每个点的颜色。下面演示了如何根据每个点的y值来设置其颜色:
import matplotlib.pyplot as plt
x_values = list(range(1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues,
edgecolor='none', s=40)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Numbers", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', which='major', labelsize=14)
#
设置每个坐标轴的取值范围
①plt.axis([0, 1100, 0, 1100000])
plt.show()
我们将参数c设置成了一个y值列表,并使用参数cmap告诉pyplot使用哪个颜色映射。这些代码将y值较小的点显示为浅蓝色,并将y值较大的点显示为深蓝色,生成的图形如图所示。
2.9 自动保存图表
要让程序自动将图表保存到文件中,可将对plt.show()的调用替换为对plt.savefig()的调用:
plt.savefig('squares_plot.png', bbox_inches='tight')
第一个实参指定要以什么样的文件名保存图表,这个文件将存储到当前python文件所在的目录中;第二个实参指定将图表多余的空白区域裁剪掉。如果要保留图表周围多余的空白区域,可省略这个实参。