前言
前面的文章我们一直在介绍《外星人入侵》的项目,充分利用了Python的相关知识,通过pygame的第三方库实现了《外星人入侵》的游戏开发。这个项目只是让大家单纯地理解Python的相关知识,当然,也在一定程度上让大家理解游戏的开发过程,但也仅限于思想的理解层面。因为一般而言,游戏是需要性能测试的,更多时候用的是C语言、c++。Python几乎不可能去用作开发,更不用说做游戏了。其实Python最实用范围最广的是数据分析以及算法方面,尤其是NLP(自然语言处理)、CV(计算机视觉)、数据挖掘等方面。接下来,我们给大家介绍第二个项目,这个项目是数据分析的基础,需要大家最好掌握。
一、项目背景
数据可视化指的是通过可视化表示探索数据,它与数据分析、数据挖掘有着紧密的联系,而数据挖掘指的是通过代码探索数据集的规律和关联。数据集可以用一行代码就能表示的小型数字列表,也可以是以其他形式的数据。
漂亮地呈现数据关乎的并非仅仅是漂亮的图片。以引人注目的简洁的方式呈现数据,让观看者能够明白其含义,发现数据集中原本未意识到的规律和含义。
所幸即便没有超级计算机,也能够可视化复杂的数据。鉴于Python的高效性,使用它在笔记本电脑上就能快速地探索由数百万数据点组成的数据集。数据点并非必须是数字,用利用Python的相关知识,我们可以也对非数字数据进行分析。
在财经、股市、天气研究等众多领域,大家都使用Python完成数据密集型工作。数据科学家使用Python编写了一系列令人印象深刻的可视化和分析工具,其中很多也可供我们使用。其中,在众多的可视化工具中,最流行的工具之一就是matplotlib
,它是一个数学绘图库。我们将使用它来制作简单的图表,如折线图和散点图。然后,我们将基于随机漫步的概念生成一个更有趣的数据集——根据一系列随机决策生成的图表。
我们接下来首先需要安装本项目需要的第三方库——matplotlib。
二、安装matplotlib
本人由于用的是windows,所以着重介绍在windows山安装matplotlib库,其他系统的也是差不多的。在安装matplotlib之前,我们应该安装Python环境、以及pip,具体安装过程详见文章。一般跟着我们前面《外星人入侵》项目敲代码的读者,应该都安装过Python以及pip,因此,这里不做介绍,大家要是安装的话,网上百度一下,很多这样的文章,跟着操作即可。
接下来详细为大家介绍matplotlib在windows中的安装。首先我们去自己电脑查看自己电脑版本以及Python的版本:
因此,我们在matplotlib官网上去寻找相应的版本进行下载;
接下来将下载好的该文件放到python或者pycharm的script目录下,注意这个里面有pip3.7。具体如下:
接着在相应位置点击鼠标右键
开黑屏终端,输入以下命令:
pip3.7 install matplotlib-3.4.3-cp37-cp37m-win_amd64.whl
回车后系统就开始安装了,由于本人电脑上有matplotlib的安装,就不重复安装了。接下来,我们对刚才安装的包进行测试;为此,首先在黑屏终端输入Python
,然后在到Python环境下输入一下的代码测试matplotlib是否安装成功:
import matplotlib
具体效果如下:
至此,我们的matplotlib安装成功。接下来,我们通过matplotlib做一些练习,从而熟悉matplotlib的相关用法。
三、matplotlib绘制简单的折线图
我们要想尽快入门matplotlib绘制的各种图表,可以去官网进行查看,入门还是很快的,我们接下来,只对常用的以及本项目中用到的功能进行介绍,剩下的感兴趣的读者可以自行去官网学习。
下面来使用matplotlib绘制一个简单的折线图,再对其进行定制,以实现信息更丰富的数据可视化。我们将使用平方数序列1、4、9、16和25来绘制这个图表。只需向matplotlib提供如下数字,matplotlib就能完成其他的工作,具体实现如下:
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
plt.plot(squares)
plt.show()
我们首先导入了模块pyplot
,并给它指定了别名plt
,以免反复输入pyplot
。在线示例大都这样做,因此这里也这样做。模块pyplot包含很多用于生成图表的函数。
我们创建了一个列表,在其中存储了前述的平方数,再将这个列表传递给函数plot()
,这个函数尝试根据这些数字绘制出有意义的图形。plt.show()
打开matplotlib查看器,并显示绘制的图形,具体如下图所示:
1、修改标签文字和线条粗细
如上图所示表明数字是越来越大的,但标签文字太小,线条太细,所幸matplotlib让我们能够调整可视化的各个方面。下面我们通过代码来改善这个图的可读性:
import matplotlib.pyplot as plt
squares = [1, 4, 9, 16, 25]
plt.plot(squares, linewidth=5)
# 设置图表标题,并给坐标轴加上标签
plt.title("Square Number", 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()
让你能够为每条轴设置标题;而函数ticket_params()
设置刻度的样式,其中指定的实参将影响x轴和y轴上的刻度(axis=‘both’),并将刻度标记的字号设置为14(labelsize=14)。
最终的图表阅读起来容易得多了,具体效果如下:
从图中可以看出:标签文字更大,线条也更粗了。
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 Number", fontsize=24)
plt.xlabel("Value", fontsize=14)
plt.ylabel("Square of Value", fontsize=14)
# 设置刻度标记的大小
plt.tick_params(axis='both', labelsize=14)
plt.show()
现在plot()将正确地绘制数据,因为我们同时提供了输入值和输出值,它无需对输出值的生成方式作出假设。最终的图形是正确的。具体如下所示:
使用plot()时可指定各种实参,还可使用众多函数进行定制。
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 Number", 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
,将在图表中央看到了一个点,具体效果如下:
4、使用scatter()绘制一系列点
要绘制一系列的点,可向scatter()传递给两个分别包含x值和y值的列表,具体实现如下:
import matplotlib.pyplot as plt
x_values = [1, 2, 3, 4, 5]
y_vslues = [1, 4, 9, 16, 25]
plt.scatter(x_values, y_vslues, s=100)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Number", 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),最终效果图如下:
5、自动计算数据
手工计算列表包含的值可能效率低下,需要绘制的点很多时尤其如此。可以不必手工计算包含点坐标的列表,而让Python循环来替我们完成这种计算。下面是绘制1000个点的代码:
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_vslues = [x**2 for x in x_values]
plt.scatter(x_values, y_vslues, s=40)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Number", 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()
我们首先创建一个包含x值的列表,其中包含数字1~1000。接下来是一个生成y值的列表解析,它遍历x值(for x in x_values
),计算其平方值(x**2),并将结果存储到列表y_values中,然后,将输入列表和输出列表传递给scatter()
。
由于这个数据集较大,我们将点设置得较小,并使用函数axis()
指定了每个坐标的取值范围。函数axis()
要求提供四个值:x和y坐标的最小值和最大值。在这里,我们将x坐标轴的取值范围设置为01100,并将y坐标轴的取值范围设置为01100000.具体效果如下:
6、删除数据点的轮廓
matplotlib允许我们给散点图中的各个点指定的颜色。默认为蓝色点和黑色轮廓,在散点图包含的数据点不多时效果很好。但绘制很多点,黑色轮廓可能会粘贴在一起。要删除数据点的轮廓,可以在调用scatter()
时传递实参edgecolor='none'
:
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_vslues = [x**2 for x in x_values]
plt.scatter(x_values, y_vslues, edgecolors='none', s=40)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Number", 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()
具体效果图如下:
7、自定义颜色
要修改数据点的颜色,可向scatter()
传递参数c,并将设置为要使用的颜色的名称,具体如下所示:
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_vslues = [x**2 for x in x_values]
plt.scatter(x_values, y_vslues, c='red', edgecolors='none', s=40)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Number", 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()
我们还可以使用RGB颜色模式自定义颜色。具体效果如下:
要指定自定义颜色,可传递参数c,并将其设置为一个元组,其中包含三个0~!之间的小数值,它们分别代表红色、绿色和蓝色分量。例如,下面的代码行创建了一个由淡蓝色点组成的散点图:
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_vslues = [x**2 for x in x_values]
plt.scatter(x_values, y_vslues, c=(0, 0, 0.8), edgecolors='none', s=40)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Number", 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()
值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅色。具体效果如下:
8、使用颜色映射
颜色映射指的是一系列颜色,它们从起始颜色渐变到结束颜色。在可视化中,颜色映射用于突出数据的规律,例如:我们可以用较浅的颜色来显示较小的值,并使用较深的颜色来显示较大的值。
模块pyplot内置了一组颜色映射。要使用这些颜色映射,我们需要告诉pyplot该如何设置数据集中每个点的颜色。接下来,我们演示了如何根据每个点的y值来设置颜色:
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues ,edgecolors='none', s=40)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Number", 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值较大的点显示为深蓝色,生成的效果图如下:
我们如果想要了解pyplot中的所有颜色的映射,可去matplotlib官网去看。具体操作如下:
首先点击Examples—>Color Examples---->单击colormaps_reference;
具体操作的效果如下:
具体文件内容如下:
9、自动保存图表
要让程序自动将图表保存在文件中,可将对plt.show()
的调用替换为对plt.savefig()
的调用:
import matplotlib.pyplot as plt
x_values = list(range(1, 1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues ,edgecolors='none', s=40)
# 设置图表标题并给坐标轴加上标签
plt.title("Square Number", 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()
plt.savefig('squares_plot.png', bbox_iches='tight')
第一个实参指定要以什么样的文件名保存图表,这个文件将存储到scatter_squares.py
所在的目录中;第二个实参指定将图表多余的空白区域裁减掉。如果要保留图表周围多余的空白区域,可省略这个实参。
总结
从本文开始为大家介绍《数据可视化》的项目,本文给大家主要介绍了项目的背景:即数据可视化的重要性以及Python的相关应用。另外好介绍了matplotlib在windows中的安装;最后介绍了matplotlib中的绘制折线图的相关知识点。Python是一门注重实际操作的语言,它是众多编程语言中最简单,也是最好入门的。当你把这门语言学会了,再去学习java、go以及C语言就比较简单了。当然,Python也是一门热门语言,对于人工智能的实现有着很大的帮助,因此,值得大家花时间去学习。生命不息,奋斗不止,我们每天努力,好好学习,不断提高自己的能力,相信自己一定会学有所获。加油!!!