【Matplotlib】Matplotlib绘图实战

原文:https://www.datacamp.com/community/tutorials/matplotlib-tutorial-python

这个Matplotlib教程将指导您掌握Python数据可视化的基础知识:图解,pyplot和pylab等的解剖,等等


人类是非常视觉的生物:当我们看到可视化的东西时,我们会更好地理解事物。然而,展示分析,结果或见解的步骤可能是一个瓶颈:您可能甚至不知道从哪里开始,或者您可能已经考虑了正确的格式,但随后会出现如下问题:“这是否正确显示我想带给我的观众?“肯定会出现在你的脑海里。

当您使用Python绘图库Matplotlib时,回答上述问题的第一步是通过构建以下主题的知识:

  • Matplotlib情节解剖:什么是子情节?什么是轴?究竟是一个数字?
  • 创建绘图,这可能会引发您需要导入的模块(pylab或pyplot?)的问题,您应该如何确定初始化图形和您的绘图的轴,如何在Jupyter笔记本中使用matplotlib等。
  • 绘制例程,从简单的方式将您的数据绘制成更高级的可视化数据的方式。
  • 基本情节定制,侧重于情节图例和文字,标题,轴标签和情节布局。
  • 保存,显示,清除......您的图表:显示图表,将一个或多个图表保存为例如pdf文件,清除坐标轴,清除图形或关闭图表等。
  • 最后,您将简要介绍两种您可以自定义Matplotlib的方式:样式表和rc设置。


Matplotlib Python剧情看起来像什么?

初看起来,当你开始绘制这个Python数据可视化库时,似乎有很多组件需要考虑。您可能会同意我的看法,即令人困惑,有时甚至不愿意看到某些地块所需的代码量,不知道从哪里开始自己以及应该使用哪些组件。

幸运的是,这个库非常灵活,并且有很多方便的内置默认设置,可以帮助您大幅度提高。因此,您不需要太多开始:您需要进行必要的导入,准备一些数据,并且您可以借助该plot()功能开始绘图准备好后,不要忘记使用该show()功能显示您的情节

看看这个例子,看看它真的有多容易:

# Import the necessary packages and modules
import matplotlib.pyplot as plt
import numpy as np

# Prepare the data
x = np.linspace(0, 10, 100)

# Plot the data
plt.plot(x, x, label='linear')

# Add a legend
plt.legend()

# Show the plot
plt.show()

请注意,您可以在别名下导入pyplot模块matplotlibplt

恭喜,您现在已经成功创建了您的第一个情节!现在我们来看一下更详细的结果图:

太好了,不是吗?

表面上看不到的是,您可能会无意识地使用内置的默认值来处理底层组件的创建,如图和轴。您将在本节讨论pylab和pyplot之间差异的更多信息。

现在,你会明白,当你了解底层组件的实例化时,使用matplotlib已经变得更容易了。或者换句话说,matplotlib情节的解剖是什么样的:


实质上,您需要考虑两个大组件:

  • 是整个窗口或页面,一切都画在。这是您在以下几点中将考虑的所有问题的顶级组成部分。你可以创建多个独立的数字。图中还可以包含其他一些东西,例如suptitle,它是图形的中心标题。您还会发现,您可以将图例和颜色栏添加到图中。
  • 对于你添加的图轴是数据被绘制的区域,具有诸如plot()和的功能scatter()并且可以具有与其相关的滴答,标签等。这解释了为什么图可以包含多个轴。

提示:例如,当您看到时plt.xlim,您会ax.set_xlim()在封面后面打电话Axes对象的所有方法作为pyplot模块中的函数存在,反之亦然。请注意,大多数情况下,您将使用pyplot模块的功能,因为它们更清洁,至少对于简单的情节来说!

当你看看下面的代码片段时,你会看到“干净”的意思。比较一下这段代码:

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)
ax.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')
ax.set_xlim(0.5, 4.5)
plt.show()

执行结果:


使用下面的代码片段:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [10, 20, 25, 30], color='lightblue', linewidth=3)
plt.scatter([0.3, 3.8, 1.2, 2.5], [11, 25, 9, 26], color='darkgreen', marker='^')
plt.xlim(0.5, 4.5)
plt.show() 

执行结果:


第二个代码块绝对清洁,不是吗?

但是,如果您有多个坐标轴,则使用第一个代码块更好,因为选择上面的隐式代码总是更好一些!在这种情况下,您想要使用Axes对象ax


除了这两个组件之外,还有一些您可以牢记:

  • 每个轴都有一个x轴和一个y轴,它们包含滴答声,它们有主要和次要的滴答线和标记标记。还有轴标签,标题和图例要考虑,当你想定制你的轴,但也考虑到轴比例和网格线可能派上用场。
  • 脊线是连接轴刻度线并指定数据区边界的线。换句话说,它们是一个简单的黑色方块,当您不绘制任何数据时您会看到,但是当您初始化轴时,如下图所示:
  • 你会发现右侧和顶部的刺被设置为隐形。
请注意 ,有时您还会阅读有关Artist对象的信息,这些对象实际上是该包必须提供给用户的所有对象。使用Matplotlib绘制的所有内容都是Artist模块的一部分。您将用于绘制数据的容器(如Axis,Axes和Figure)以及其他图形对象(如文本,修补程序等)是Artists类型。

对于那些已经有了一些编码经验的人来说,查看和研究在Matplotlib库中找到的代码示例可能会很好


Matplotlib,pyplot和pylab:它们是如何相关的?

首先,你现在已经知道Matplotlib了。当您谈论“Matplotlib”时,您会讨论整个Python数据可视化软件包。这不应该让你感到惊喜:)

其次,pyplotmatplotlib包中的一个模块这就是为什么你经常看到matplotlib.pyplot代码。该模块提供了一个界面,允许您隐式和自动创建图形和坐标轴以实现所需的绘图。

如果您想在不实例化任何图形或轴的情况下快速绘制某些内容,这一点特别方便,正如您在本教程第一部分的示例中看到的那样。你看,你没有明确指定这些组件,但是你可以输出一个你甚至定制过的图!默认值已初始化,您所做的任何自定义操作都将使用当前的图形和轴来完成。

最后,pylab是另一个模块,但它会与matplotlib软件包一起安装它大量进口pyplotnumpy图书馆,一般建议您在使用数组时,交互式地进行数学计算,并希望获得绘图功能。

您可能仍然会在较老的教程和示例中看到这一点matplotlib,但不再推荐使用它,特别是当您在Jupyter笔记本中使用IPython内核时。你可以在这里阅读更多

作为一个解决方案,你可以使用最好的%matplotlib结合魔法与正确的后端,如inlineqt等大部分的时间,你会想用inline,因为这将确保该地块被嵌入内的笔记本电脑。请阅读DataCamp Jupyter Notebook权威指南中的更多内容

请注意,当您不在Jupyter笔记本上工作时,您仍然需要选择不同的后端,具体取决于您的使用情况。换句话说,如果您不想在笔记本中嵌入绘图,但您更希望将它们嵌入到图形用户界面,批处理脚本或Web应用程序服务器等中,则需要指定所需的后端使用。但是,这个主题不在本教程的范围之内; 相反,本教程假定您将使用Matplotlib将图像保存到本地文件系统。


Matplotlib图的数据

正如您在前面的章节中阅读的那样,Matplotlib通常用于可视化分析或计算。这就是为什么你必须采取的第一步,以便开始在Python自己绘制图形是考虑修改NumPy,科学计算的Python库。

科学计算可能看起来并不太感兴趣,但是当你在做数据科学的时候,你会发现自己在存储在数组中的数据上工作很多。您需要对它们执行操作,检查数组并对其进行操作,以便处理分析中有趣并且格式正确的数据(的子集)等。

总之,当你使用这个数据可视化库时,你会发现NumPy非常方便。

当然,数组并不是你传递给绘图函数的唯一东西; 例如,也有可能通过Python列表。


创建你的Plot

好的,你准备用Python自己创建你的第一个情节!正如您在前面的章节中阅读过的那样,该图是解锁此软件包的第一步,也是解锁功能的关键。接下来,您将看到您在上面的代码块中初始化图的轴fig.add_axes()

# Import `pyplot`
import matplotlib.pyplot as plt

# Initialize a Figure 
fig = plt.figure()

# Add Axes to the Figure
fig.add_axes([0,0,1,1]) 

执行结果:

Out[1]: <matplotlib.axes._axes.Axes at 0x7feba8761748>


很简单,不是吗?


什么是子Plot?

你已经看到了一个情节的所有组成部分,并且已经初始化了你的第一个数字和Axes,但是为了使事情更复杂一点,你有时会看到子图出现在代码中。

现在,不要灰心!

您可以使用子图设置并将您的轴放置在常规网格上。这意味着在大多数情况下,轴和子图是同义词,它们将指定相同的东西。当您调用子图将轴添加到您的图形时,请使用该add_subplots()功能。然而,函数add_axes()add_subplots()函数之间有区别,但您稍后会在教程中学到更多。

考虑下面的例子:

# Import the necessary packages and modules
import matplotlib.pyplot as plt
import numpy as np

# Create a Figure
fig = plt.figure()

# Set up Axes
ax = fig.add_subplot(111)

# Scatter the data
ax.scatter(np.linspace(0, 1, 5), np.linspace(0, 5, 5))

# Show the plot
plt.show()

执行结果:


你会发现add_subplot()itsef 中的函数也会给你带来挑战,因为你add_subplots(111)在上面的代码块中看到了。

什么111意思?

好吧,111等于1,1,1,这意味着你实际上给了三个参数add_subplot()三个参数指定行数(1),列数(1)和绘图编号(1)。所以你实际上制作一个子图。


请注意,当您使用此功能时,您可以真正使用此功能,尤其是当您刚刚开始使用此功能时,您会一直忘记三个数字的含义。

考虑下面的命令,并试图设想情节会是什么样子,以及你的数字有多少轴:ax = fig.add_subplot(2,2,1)

得到它了?

没错,你的人物总共有四个坐标轴,排列成两行两列的结构。用你已经考虑的代码行,你说变量ax是你想要开始绘制的四个轴中的第一个。这种情况下的“第一个”意味着它将是您初始化的2x2结构左侧的第一个轴。


add_axes()之间的区别是什么add_subplot()

之间的差异fig.add_axes()fig.add_subplot()不在于结果:它们都返回一个轴对象。但是,它们在用于添加坐标轴的机制方面有所不同:您要传递一个列表,add_axes()左下角的点,宽度和高度就是这个列表的左下角。这意味着轴对象位于绝对坐标中。

相反,该add_subplot()功能不提供将轴放置在某个位置的选项:但是,它确实允许根据子区网格来定位轴,如上面的部分所示。

在大多数情况下,您将使用add_subplot()创建轴; 只有在定位很重要的情况下,你才会诉诸于add_axes()或者,subplots()如果您想同时获得一个或多个子图,也可以使用您会在下一节看到一个如何工作的例子。


如何改变数字的大小

现在您已经看到如何从头开始初始化图形和轴,您还需要知道如何更改程序包为您设置的某些小细节,例如图形大小。

假设你没有奢侈品跟随默认设置,并且你想改变它。你如何手动设置你的数字的大小?

就像这个软件包的一切一样,这很容易,但你首先需要知道要改变什么。

figsize为你plt.figure()pyplot模块函数添加一个参数你只需要用英寸来指定一个元素的宽度和高度,就像这样plt.figure(figsize=(3,4)),它就可以工作。

请注意,您也可以传递figsizeplt.subplots()相同模块功能; 内部工作方式与figure()您刚刚看到功能相同

看到一个如何在这里工作的例子:

# Import `pyplot` from `matplotlib`
import matplotlib.pyplot as plt

# Initialize the plot
fig = plt.figure(figsize=(20,10))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)

# or replace the three lines of code above by the following line: 
#fig, (ax1, ax2) = plt.subplots(1,2, figsize=(20,10))

# Plot the data
ax1.bar([1,2,3],[3,4,5])
ax2.barh([0.5,1,2.5],[0,1,2])

# Show the plot
plt.show()

执行结果:



使用Pyplot:绘制例程

现在您已经准备好开始绘制数据了,现在应该仔细查看一些绘图程序。你会经常碰到像plot()和的函数scatter(),它们或者用线或者连接它们的标记来绘制点,或者绘制缩放或者着色的未连接点。

但是,正如您在第一部分的例子中已经看到的那样,您不应该忘记传递您希望这些函数使用的数据!

这些功能只是最基本的功能。你将需要一些其他功能来确保你的情节看起来很棒:

ax.bar() 垂直的矩形
ax.barh() 横向矩形
ax.axhline() 水平线跨轴
ax.vline() 垂直线穿过轴
ax.fill() 填充的多边形
ax.fill_between() 在y值和0之间填充
ax.stackplot() 堆积阴谋

如果您好奇如何使用这些函数来绘制数据,请考虑以下示例。请注意变量xy变量已经为您加载

# Import `pyplot` from `matplotlib`
import matplotlib.pyplot as plt

# Initialize the plot
fig = plt.figure()
ax1 = fig.add_subplot(131)
ax2 = fig.add_subplot(132)
ax3 = fig.add_subplot(133)

# Plot the data
ax1.bar([1,2,3],[3,4,5])
ax2.barh([0.5,1,2.5],[0,1,2])
ax2.axhline(0.45)
ax1.axvline(0.65)
ax3.scatter(x,y)

# Show the plot
plt.show()

执行结果:


大多数功能都是自己说话的,因为名字很清楚。但这并不意味着你需要限制自己:例如,fill_between()对于那些想要创建区域图的人来说,该功能是完美的,但它们也可以用来创建堆积线图; 只需使用绘图功能几次,以确保区域重叠,并给予堆叠的幻想。

请注意,当然,仅仅传递数据不足以创建出很好的图。确保以可视化的方式处理数据:不要害怕改变阵列形状,组合阵列等。

当你继续前进,并开始使用矢量字段或数据分布时,可能需要查看以下功能:

ax.arrow() 箭头
ax.quiver() 2D的箭头领域
ax.streamplot() 2D矢量场
ax.hist() 直方图
ax.boxplot() 箱形图
ax.violinplot() Violinplot

当然要注意,你可能不会使用这些表中列出的所有功能; 这真的取决于你的数据和你的用例。如果您对数据科学完全陌生,那么您可能需要首先查看统计绘图例程!

另一方面,当您使用二维或nD数据时,您可能还会发现自己需要一些更高级的绘图程序,例如这些程序:

ax.pcolor() 假彩色图
ax.pcolormesh() 假彩色图
ax.contour() 等高线图
ax.contourf() 填充轮廓图
ax.clabel() 标记的等高线图

请注意,等高线图用于探索三个变量之间的潜在关系。就像等高线图一样,伪彩色图也可用于此目的,因为它们是从上面看的表面图。当然,这几乎不是您可以用来绘制数据的所有功能。

例如,如果您正在处理图片或2D数据,您可能还想查看imshow()以在子图中显示图片。有关如何使用该imshow()功能的实际示例,请参阅DataCamp的scikit-learn教程

本教程中的示例还清楚地表明,这个数据可视化库真的是数据科学工作流程中的翘楚:您必须非常精通一般的Python概念,比如列表和控制流,这些概念可能会特别出现如果你想自动绘制大量的小区图,那么很方便。


自定义您的PyPlot

关于这个包的很多问题都来自这样一个事实,即你可以做很多事情来个性化你的情节,并确保它们是独一无二的:除了调整颜色,你还可以选择改变标记,线条和线宽,添加文本,图例和注释,并更改您的图的限制和布局。

事实上,当涉及到这些情节时,存在无限的可能性,这使得很难列出在开始处理此主题时需要了解的一些事情。

你应该留在脑海中的大提示不仅仅是画廊,它包含许多已经为你编码并可以使用的现实生活中的例子,而且还包括文档,它可以告诉你更多关于论点的论点你可以通过某些功能来调整视觉特征。

另外请记住,对于一个问题有多种解决方案,并且当您将自己的双手弄脏包装本身以及遇到麻烦时,您会学到大部分这些东西。您将在本节中看到一些最常见的问题和解决方案。

删除一个轴

如果您想要从绘图中移除一个轴,您可以使用它delaxes()来移除和更新当前轴:

# Import `pyplot` from `matplotlib`
import matplotlib.pyplot as plt
import numpy as np

# Initialize the plot
fig = plt.figure()
ax1 = fig.add_subplot(131)
ax2 = fig.add_subplot(132)
ax3 = fig.add_subplot(133)

# Plot the data
ax1.bar([1,2,3],[3,4,5])
ax2.barh([0.5,1,2.5],[0,1,2])
ax2.axhline(0.45)
ax1.axvline(0.65)
ax3.scatter(np.linspace(0, 1, 5), np.linspace(0, 5, 5))

# Delete `ax3`
fig.delaxes(ax3)

# Show the plot
plt.show()

执行结果:


请注意,您可以通过fig.add_axes(ax)在之后添加来恢复已删除的轴fig.delaxes(ax3)

如何把传说从剧情中解脱出来

有很多方法可以解决这个问题,但大多数都回到您可以提供的参数上legend()

  • 您可以指定loclocation中心左或右上方的参数,这可以确保您的图例不落在轴或子图区域中。
  • 或者,您也可以将bbox_to_anchor参数添加到您的函数中,并传递一个元组与要放置图例的坐标。在这种情况下,该框放在绘图区域的右上角:ax.legend(bbox_to_anchor=(1.1, 1.05))

如何设置剧情标题和轴标签

要更改绘图标题和坐标轴标签,可以采用以下方法之一,具体取决于要使用哪个容器:

  • 设置这些东西最简单的方法是使用ax.set(title="A title", xlabel="x", ylabel="y")ax.set_xlim()ax.set_ylim()ax.set_title()
  • 如果你想和这个人物一起工作,你也可以求助于fig.suptitle()为你的情节添加一个标题。
  • 如果你正在做使用该软件包所提供的默认设置,您可能需要使用plt.title()plt.xlabel()plt.ylabel()
  • 定义您自己的样式表或更改默认matplotlibrc设置。在这里阅读更多

如何修复剧情布局

当你使用subplots来建立你的情节时需要考虑的一件事是tight_layout函数,它可以帮助你确保这些情节很好地适合你的形象。理想情况下,您在绘制数据并自定义绘图后调用它; 所以这是你打电话之前plt.show(),你应该使用plt.tight_layout()

此外,您可能也有兴趣使用subplots_adjust(),它允许您手动设置为子空间之间的空白空间保留的宽度和高度,还可以修复左右侧,以及子图的顶部和底部。


显示,保存并关闭你的Plot

在完成所有必要的自定义设置后,您将需要显示您的情节,因为正如您在终端工作时注意到的那样,您只会看到一个对象已经制作完成,但是每次您都看不到精彩的情节作出调整。

在本教程的第一个示例中,这是隐式完成的;

你还记得吗?这是这段代码:

# Import the necessary packages and modules
import matplotlib.pyplot as plt
import numpy as np

# Prepare the data
x = np.linspace(0, 10, 100)

# Plot the data
plt.plot(x, x, label='linear')

# Add a legend
plt.legend()

# Show the plot
plt.show()

执行结果:


该行plt.show()确实说你想看到情节。如果你执行这一行,你会看到一个窗口弹出。你会看到它是否看起来像你脑海中的东西!

但这是你的问题开始的地方。如何保存这张图片,如果不符合您的喜好,您是否可以清除图片以便重新开始?以下简短的部分将涵盖这些问题。

如何将绘图保存到图像文件

你可以很容易地将数字保存到,例如,通过利用一个PNG文件plt.savefig()您需要传递给此函数的唯一参数是文件名,就像本例中一样:

# Save Figure
plt.savefig("foo.png")

# Save Transparent Figure
plt.savefig("foo.png", transparent=True)

通过执行这一行代码,您可以将您对图像文件所做的绘图保存而不是显示它。

如何将绘图保存到PDF文件

如果您想将多个图表保存为pdf文件,您需要使用pdf后端,您可以轻松导入该后端:

# Import PdfPages
from matplotlib.backends.backend_pdf import PdfPages

# Initialize the pdf file
pp = PdfPages('multipage.pdf')

# Save the figure to the file
pp.savefig()

# Close the file
pp.close()

何时使用cla()clf()还是close()

当你终于准备好对你的情节进行检查时,是时候继续与别的事情相处了(或许有另一个情节!)。当你第一次使用这个数据可视化库的时候,它可能在开始的时候很奇怪,因为你当然可以关闭出现的GUI窗口,但这通常不是你想要处理的东西,因为它当你一次处理几件事情时并不总是奏效。

你必须明确告诉Matplotlib关闭你一直在处理的情节,以便继续前进。有三个功能,一旦你在这个时候就会派上用场:

  • 使用plt.cla()明确的轴线,
  • plt.clf() 清除整个人物,并且
  • plt.close() 关闭一个弹出的窗口向你展示你的情节。


定制Matplotlib

到目前为止,你已经熟悉了一些基本的选项来定制你的情节。但是如果你想在图书馆层面而不是情节层面上定制更多的定制内容呢?在这种情况下,您也不必惊慌:Matplotlib为您提供了几个选项来调整一些内部工作。本节将介绍两个选项,即样式表和rc设置。

如果你想知道更多,绝对看看这个页面

如何使用ggplot2样式

对于您中的R爱好者,Matplotlib还为您提供了将情节样式设置为的选项ggplot您可以通过运行以下代码轻松完成此操作:

# Import `pyplot` 
import matplotlib.pyplot as plt

# Set the style to `ggplot`
plt.style.use("ggplot")

rc设置

“rc”在配置文件中很常见:它们通常以英文结尾rc它来自具有CONFIGS作为可执行的做法:它们自动R未和C onfigure设置,例如。你可以在这里阅读更多Matplotlib有这样一个rc文件,您可以对其进行动态和静态调整。

要动态更改默认的rc设置,可以使用以下rcParams变量:

# Import the necessary packages and modules
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

# Uncomment following line to see the effect 
#mpl.rcParams['lines.linewidth'] = 5

# Prepare the data
x = np.linspace(0, 10, 100)

# Plot the data
plt.plot(x, x, label='linear')

# Add a legend
plt.legend()

# Show the plot
plt.show()

执行结果:


您只是在上面的示例中调整了线宽,但您还可以更改图形大小和dpi,线宽,颜色和样式,轴,轴和网格属性,文本和字体属性...

如果你想更静态地工作,你应该也可能知道你有一个matplotlibrc配置文件,你可以使用它来定制各种属性(就像你上面用线宽参数所做的那样)。如果你想找到这个特定的文件,你可以运行以下命令:

import matplotlib

matplotlib.matplotlib_fname()
接下来,您可以拉起文件并开始使用设置进行播放!


结束!


猜你喜欢

转载自blog.csdn.net/chenvast/article/details/80377217