「 Python数据可视化系列」5. 使用NumPy和Matplotlib进行数据可视化

来源 | 「Practical Python Data Visualization  A Fast Track Approach To Learning Data Visualization With Python」

作者 | Ashwin Pajankar

译者 | Liangchu

校对 | gongyouliu

编辑 | auroral-L

全文共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)所示:

 

❤总结

本章重点介绍可用于可视化的各种自定义设置。我们学到了很多可视化数据的知识。本章所涵盖的概念将在本书中被用来可视化数据。

在下一章中,我们将进一步探讨数据可视化。我们将学习形象化的图像和三维形状,并在图像操作的基础上查看这些基础知识。


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据与智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值