Python可视化 5. 使用Matplotlib数据可视化
全文共4750字,预计阅读时间20分钟。
第五章 使用NumPy和Matplotlib进行数据可视化
目录
一、Matplotlib
二、使用NumPy和Matplotlib实现可视化
三、单线图(Single Line Plots)
四、多线图(Multiline Plots)
五、网格、轴和标签(Grid,Axes,and Labels)
六、颜色、样式和标记(Colors,Style,and Markers)
❤总结
第四章「科学Python生态和Numpy」介绍了NumPy的基本知识。你学习了如何安装NumPy以及如何创建ndarrays。在本章中,我们将通过查看一些ndarray创建程序来继续学习NumPy。我们也会着手学习科学计算生态系统的数据可视化库——Matplotlib。我们将使用NumPy ndarray创建程序(程序的作用类似于函数,但含义更为丰富一些。程序是某个系统对外提供的功能接口或服务的集合。比如操作系统的API、服务等就是程序。)。来演示Matplotlib的可视化效果。本章内容比较详细,重点是编程以及可视化。本章介绍以下内容:
· Matplotlib
· 使用NumPy和Matplotlib实现可视化
· 单线图
· 多线图
· 网格、轴和标签
· 颜色、样式和标记
在本书的其余章节中,我们将使用Matplotlib和NumPy演示数据可视化。
一、Matplotlib
Matplotlib是SciPy的重要组成部分,用于可视化。它是NumPy的扩展。它提供了一个类似MATLAB的绘图和可视化界面。它最初是由 John D Hunter开发的,作为一种可用于Python的开源替代方案。
我们可以使用Jupyter Notebook安装它,如下所示:
!pip3 install matplotlib
要在笔记本中使用它进行基本的绘图操作,必须按如下方式导入其pyplot模块:
import matplotlib.pyplot as plt
此外,要在笔记本中显示Matplotlib可视化效果,必须运行以下命令:
%matplotlib inline
这将使得Matplotlib在产生可视化效果的代码单元格的正下方内联显示输出。当我们使用Matplotlib时,我们将始终使用这种内联输出。
还需要导入NumPy,如下所示:
import numpy as np
有关Matplotlib的详细信息,请访问https://matplotlib.org/。
二、使用NumPy和Matplotlib实现可视化
我们现在将学习如何使用ndarray创建程序来创建NumPy ndarrays,然后使用Matplotlib将它们可视化。现在先开始创建ndarray的程序。
第一个程序是arange(),它以给定的间隔创建均匀分布的值。终止值(stop value)参数是十分必要的。开始值(start value)和间隔(interval)参数的默认值分别为0和1。下面让我们看一个例子:
x = np.arange(5)
在本例中,终止值是5,因此它创建一个从0开始到4结束的ndarray。函数返回具有半开放间隔(相当于数学定义中的开区间)的序列,这意味着终止值不包含在输出中。由于我们没有指定间隔,所以它默认是1。我们可以看到它的输出和数据类型如下:
print(x)
type(x)
以下是输出:
[0 1 2 3 4]
numpy.ndarray
接下来绘制这些数字。对于二维绘图,我们需要X-Y对。为求简洁,设定y = f(x) = x,并运行下面的语句表示这个函数关系(X-Y对):
y=x
现在,使用函数plot()将其可视化。它需要X、Y的值和绘制选项(plotting options)作为参数。我们将在本章后面了解有关绘制选项的更多信息。
plt.plot(x, y, 'o--')
plt.show()
函数show()画出图形。正如我们在上面所看到的,我们输入也就是使用的绘制选项是o--。这表示点用实心圆表示,线用虚线表示,如图(5-1)所示:
下面看函数arange()的函数调用示例,其start和stop参数如下:
np.arange(2, 6)
它会返回以下输出(直接打印,我们不将其存储为变量):
array([2, 3, 4, 5])
我们甚至可以设置间隔参数,如下所示:
np.arange(2, 6, 2)
以下是输出:
array([2, 4])
输出如图(5-2)所示:
函数linspace(start,stop,number)返回指定间隔内的等距数字。我们必须将开始值、终止值和值的数目传递给它,如下所示:
N = 11
x = np.linspace(0, 10, N)
print(x)
该代码创建11个数字(0–10,包括0和10),如下所示:
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
如下,将它可视化:
y = x
plt.plot(x, y, 'o--')
plt.axis('off')
plt.show()
输出如图(5-3)所示:
如你所见,我们使用plt.axis('off')将轴关掉了,所以没有绘制出来。
类似地,我们可以计算并可视化logspace( logspace是对数等比数列创建函数,np.logspace(start=开始值,stop=结束值,num=元素个数,base=指定对数的底, endpoint=是否包含结束值))函数中的值,如下所示:
y = np.logspace(0.1, 1, N)
print(y)
plt.plot(x, y, 'o--')
plt.show()
输出如图(5-4)所示:
我们甚至可以计算几何级数(等比数列)中的一个级数,如下所示:
y = np.geomspace(0.1, 1000, N)
print(y)
plt.plot(x, y, 'o--')
plt.show()
输出如图(5-5)所示:
三、单线图(Single Line Plots)
在本节中,我们将探讨几种绘制单线图的方法。我们使用函数plot()绘制图形。如果图形中只有一个使用函数plot()的可视化,则称为单线图。下面会用几个例子来进一步探讨这个问题。
我们还可以使用Python列表(list)来可视化图形,如下所示:
x = [1, 4, 5, 2, 3, 6]
plt.plot(x)
plt.show()
输出如图(5-6)所示:
在这种情况下假设了y轴的值。下面是另一个例子:
x = np.arange(10)
plt.plot(x)
plt.show()
输出如图(5-7)所示:
接下来可视化一个二次方程y=f(x)=x²的图形,代码如下所示:
plt.plot(x, [y**2 for y in x])
plt.show()
输出如图(5-8)所示:
可以用一种简单的方法编写代码达到同样目的:
plt.plot(x, x**2)
plt.show()
四、多线图(Multiline Plots)
我们可以在同一个可视化中显示多个绘图。看看下面这个例子就能知道如何在同一个可视化中显示多条曲线:
x = np.arange(10)
plt.plot(x, x**2)
plt.plot(x, x**3)
plt.plot(x, x*2)
plt.plot(x, 2**x)
plt.show()
输出如图(5-9)所示:
可以看到,Matplotlib会自动为不同曲线指定不同颜色。
下面是上述代码的简化版本:
plt.plot(x, x**2, x, x**3, x, x*2, x, 2**x)
plt.show()
输出与图(5-9)相同。
下面是另一个例子:
x = np.array([[1, 2, 6, 3], [4, 5, 3, 2]])
plt.plot(x)
plt.show()
输出如图(5-10)所示:
五、网格、轴和标签(Grid,Axes,and Labels)
我们前面看到了如何在可视化中启用网格,可以用语句plt.grid(True)来完成该项操作。现在我们将学习如何控制轴的边界,然而在此之前,我们将快速学习如何将一个可视化输出保存为图像。请看以下代码:
x = np.arange(3)
plt.plot(x, x**2, x, x**3, x, 2*x, x, 2**x)
plt.grid(True)
plt.savefig('test.png')
plt.show()
语句plt.savefig('test.png')将图像保存在Jupyter Notebook文件的当前目录中。输出如图(5-11)所示:
我们可以看到轴的边界是默认设置的。我们可以将它们设置为如下所示的特定值:
x = np.arange(3)
plt.plot(x, x**2, x, x**3, x, 2*x, x, 2**x)
plt.grid(True)
plt.axis([0, 2, 0, 8])
print(plt.axis())
plt.show()
输出如图(5-12)所示:
语句plt.axis([0, 2, 0, 8])设置了轴的值。第一对(0,2)表示x轴的限制,第二对(0,8)表示y轴的限制。我们可以使用函数xlim()和ylim()编写语法不同的代码,如下所示:
x = np.arange(3)
plt.plot(x, x**2, x, x**3, x, 2*x, x, 2**x)
plt.grid(True)
plt.xlim([0, 2])
plt.ylim([0, 8])
plt.show()
此代码产生与上图(5-12)完全相同的输出。可以按如下方式添加轴的标题和标签:
x = np.arange(3)
plt.plot(x, x**2, x, x**3, x, 2*x, x, 2**x)
plt.grid(True)
plt.xlabel('x = np.arange(3)')
plt.xlim([0, 2])
plt.ylabel('y = f(x)')
plt.ylim([0, 8])
plt.title('Simple Plot Demo')
plt.show()
它生成的输出包括标签和标题,如图(5-13)所示:
我们可以在plot()函数中传递参数label,然后调用函数legend()来创建图例,如下所示:
x = np.arange(3)
plt.plot(x, x**2, label='x**2')
plt.plot(x, x**3, label='x**3')
plt.plot(x, 2*x, label='2*x')
plt.plot(x, 2**x, label='2**x')
plt.legend()
plt.grid(True)
plt.xlabel('x = np.arange(3)')
plt.xlim([0, 2])
plt.ylabel('y = f(x)')
plt.ylim([0, 8])
plt.title('Simple Plot Demo')
plt.show()
这将产生一个带有图例的曲线输出,如图(5-14)所示:
不需要像上面一样将图例作为参数传递给函数plot(),我们可以将字符串列表作为参数传递给函数legend(),如下所示:
x = np.arange(3)
plt.plot(x, x**2, x, x**3, x, 2*x, x, 2**x)
plt.legend(['x**2', 'x**3', '2*x', '2**x'])
plt.grid(True)
plt.xlabel('x = np.arange(3)')
plt.xlim([0, 2])
plt.ylabel('y = f(x)')
plt.ylim([0, 8])
plt.title('Simple Plot Demo')
plt.show()
将产生和上图(5-14)相同的输出。
我们还可以通过对前面的代码进行以下更改来更改图例框的位置:
plt.legend(['x**2', 'x**3', '2*x', '2**x'], loc='upper center')
输出如图(5-15)所示:
六、颜色、样式和标记(Colors,Style,and Markers)
到目前为止,对于多行打印,我们已经知道Matplotlib会自动指定颜色、样式和标记。我们还看到了一些定制它们的示例。在本节中,我们将详细介绍如何自定义它们。
先从颜色开始。下面的代码列出了Matplotlib支持的所有原色(在本例中,我们暂时不自定义样式和标记)。
x = np.arange(5)
y = x
plt.plot(x, y+1, 'g')
plt.plot(x, y+0.5, 'y')
plt.plot(x, y, 'r')
plt.plot(x, y-0.2, 'c')
plt.plot(x, y-0.4, 'k')
plt.plot(x, y-0.6, 'm')
plt.plot(x, y-0.8, 'w')
plt.plot(x, y-1, 'b')
plt.show()
输出如图(5-16)所示:
我们还可以编写如下代码:
plt.plot(x, y+1, 'g', x, y+0.5, 'y', x, y, 'r', x, y-0.2, 'c', x, y-0.4, 'k', x, y-0.6, 'm', x, y-0.8, 'w', x, y-1, 'b')
plt.show()
输出将与上图(5-16)完全相同。
下面介绍样式的自定义。我们可以按以下方式自定义线条样式:
plt.plot(x, y, '-', x, y+1, '--', x, y+2, '-.', x, y+3, ':')
plt.show()
输出如图(5-17)所示:
你甚至可以改变标记,如下所示:
plt.plot(x, y, '.')
plt.plot(x, y+0.5, ',')
plt.plot(x, y+1, 'o')
plt.plot(x, y+2, '<')
plt.plot(x, y+3, '>')
plt.plot(x, y+4, 'v')
plt.plot(x, y+5, '^')
plt.plot(x, y+6, '1')
plt.plot(x, y+7, '2')
plt.plot(x, y+8, '3')
plt.plot(x, y+9, '4')
plt.plot(x, y+10, 's')
plt.plot(x, y+11, 'p')
plt.plot(x, y+12, '*')
plt.plot(x, y+13, 'h')
plt.plot(x, y+14, 'H')
plt.plot(x, y+15, '+')
plt.plot(x, y+16, 'D')
plt.plot(x, y+17, 'd')
plt.plot(x, y+18, '|')
plt.plot(x, y+19, '_')
plt.show()
输出如图(5-18)所示:
所有三种特性(颜色、标记和线样式)都可以组合在一起,以达到自定义可视化效果的目的,如下所示:
plt.plot(x, y, 'mo--')
plt.plot(x, y+1 , 'g*-.')
plt.show()
输出如图(5-19)所示:
这些是基本的自定义,但你可以更详细地定制所有内容。例如,使用此代码自定义其他详细信息:
plt.plot(x, y, color='g', linestyle='--',
linewidth=1.5,
marker='^', markerfacecolor='b',
markeredgecolor='k',
markeredgewidth=1.5, markersize=5)
plt.grid(True)
plt.show()
输出如图(5-20)所示:
你甚至可以自定义x轴和y轴上的值,如下所示:
x = y = np.arange(10)
plt.plot(x, y, 'o--')
plt.xticks(range(len(x)), ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
plt.yticks(range(0, 10, 1))
plt.show()
输出如图(5-21)所示:
❤总结
本章重点介绍可用于可视化的各种自定义设置。我们学到了很多可视化数据的知识。本章所涵盖的概念将在本书中被用来可视化数据。
在下一章中,我们将进一步探讨数据可视化。我们将学习形象化的图像和三维形状,并在图像操作的基础上查看这些基础知识。