数据预处理|2. Matplotlib 回顾
Matplotlib是我们从数据中创建可视化的首选模块。这个模块不仅可以画出许多不同的图,而且还让我们有能力根据自己的需要设计和定制图。Matplotlib将为我们的数据分析和数据预处理之旅提供大量的功能,以实现有效的可视化。
在我们开始回顾这个有价值的模块之前,我想让你知道,这一章并不是要成为Matplotlib的全面教学指南,而是一个概念、函数和例子的集合,这些概念、函数和例子在我们以后的章节中介绍数据分析和数据预处理时将是非常宝贵的。
实际上,我们在上一章已经开始使用这个模块了。我们在第1章《NumPy和Pandas的核心模块回顾》中介绍的Pandas绘图函数,在Pandas函数探索DataFrame的部分下,实际上是Pandas内部使用的Matplotlib视觉。
在这一章中,我将首先介绍Matplotlib可以绘制的主要图谱。之后,我将介绍一些设计和改变视觉效果的功能。然后,我们将了解Matplotlib宝贵的子图绘制能力,这将使我们能够创建更复杂和有效的可视化。
本章将涉及以下主题。
- 主图
- 修改视觉图
- 子图
- 调整视觉图的大小并保存它们
1 在Matplotlib中绘制主要图表
用Matplotlib绘制视觉图很容易。你所需要的只是正确的输入和对数据的正确理解。在Matplotlib中,我们用来绘制的主要五种视觉效果是直方图、博列表、柱状图、线图和散点图。让我们通过下面的例子来介绍它们。
1.1 使用直方图或箱型图总结数字属性
我们已经使用Pandas绘制了直方图,我们在上一章的Pandas函数探索数据框架一节中了解了这一点。然而,同样的图也可以用Matplotlib来绘制。下面的截图显示了导入Matplotlib的最佳和最常用的方法。这里有两个要点。
- 首先,你要使用plt的别名,因为其他人都用这个。
- 第二,你要导入matplotlib.pyplot,而不是仅仅导入matplotlib,因为我们从matplotlib中需要的一切都在.pyplot下。
下面截图中的第二块代码显示了使用Matplotlib绘制直方图是多么容易。你所需要做的就是将你想要绘制的数据输入plt.hist()。最后一行代码,plt.show(),是我经常添加的,以迫使Jupyternotebook只显示我想要的图,而不显示图中的其他输出。运行plt.hist(adult_df.age)本身就可以看到区别。

下面的截图则显示了使用plt.boxplot()对同一数据进行的boxplot。
boxplot()。我还要求通过指定vert=False来水平绘制boxplot,这样boxplot和前面的直方图就可以进行直观的比较。

到目前为止,我们已经学会了Matplotlib模块中的两个主要绘图。接下来,我们将介绍直线图。
1.2 用线图观察数据的趋势
线形图,不完全是,但非常经常,被应用于时间序列数据以显示趋势。
时间序列数据的一个很好的例子是股票价格。例如,亚马逊公司的股票价格每分钟都在变化,如果有人有兴趣看到这些股票价格的变化趋势,他们可以用线图来做。
我们将使用亚马逊和苹果的股票价格来展示线状图在说明趋势方面的应用。下面的代码显示了使用pd.read_csv()函数加载该数据与亚马逊股票.csv和苹果股票.csv文件的过程。这些文件包含亚马逊和苹果从2000年到2020年的股票价格。

下面的截图显示我们使用plt.plot()函数来绘制股票收盘价的线图。

1.3 使用散点图将两个数字属性联系起来
散点图可以用plt.scatter()函数来绘制。这个函数非常适用于研究数字属性之间的关系。例如,下面的截图向我们展示了亚马逊和苹果股票的价格在2000年到2020年之间的关系。这个散点图中的每个点代表2000年至2020年的一个交易日。

散点图可以用plt.scatter()函数来绘制。这个函数非常适用于研究数字属性之间的关系。例如,下面的截图向我们展示了亚马逊和苹果股票的价格在2000年到2020年之间的关系。这个散点图中的每个点代表2000年至2020年的一个交易日。
2 修改视觉效果
Matplotlib模块在允许你修改绘图,使其满足你的需求方面非常出色。在修改一个视觉图之前,你首先需要知道你打算修改的视觉图部分的名称。下图向你展示了这些视觉的解剖结构,是一个很好的参考,可以找到你打算修改的部分的名称。
在下面的例子中,我们将看到如何修改可视化的标题和标记,以及可视化的标签和坐标轴的刻度。这些是你最经常需要修改的部分。如果你发现自己也需要修改其他部分,你将如何去做这些事情是非常相似的,只要你知道你打算修改的东西的名称,你在谷歌上一搜就能找到它是怎么做的。

2.1 给视觉效果添加标题,给轴添加标签
要修改Matplotlib可视化的任何部分,你需要执行一个可以做修改的函数。例如,要给一个视觉文件添加一个标题,你需要在执行一个视觉文件后使用plt.title()。另外,为了给x轴或y轴添加标签,你可以使用plt.xlabel()或plt.ylabel()。
下面的截图显示了应用plt.title()和plt.ylabel()分别给视觉添加标题和给y轴添加标签的情况。

在学习了如何添加标题和标签之后,我们现在将把注意力转向学习如何添加和修改图例。
2.2 添加图例
要在Matplotlib的视觉中添加图例,有两个步骤。
- 首先,你需要在向Matplotlib介绍每一段数据时,添加一个相关的标签。
- 第二,在执行视觉效果后,你需要执行
plt.legend()。

2.3 修改刻度线
在Matplotlib视觉效果的所有修改中,修改刻度线可能是最复杂的。
让我们来讨论一下与线段图有关的修改方法,你可以很容易地将其推导到其他的视觉效果上。
在你能成功地修改刻度线之前,你需要知道一点关于plt.plot()函数的工作原理。当第一次引入线段图时,你要么明确地将x轴引入plt.plot()函数,要么该函数假定从0开始的整数值到为绘图而输入的数字值减去1。由于我们在过去的几幅线图中没有明确引入x值(见前文),plt.plot()函数已经假定了x轴的整数值。然而,请注意输出的视觉效果,其中只有0、1000、2000、3000、4000和5000的x值被表示。

如果我们想用交易日的实际日期来重新表示这些代表交易日的整数呢?这可以用plt.xticks()函数轻松完成。
在介绍了你想要表示的整数后,你还需要向函数介绍这些整数的替换对应物。
下面的截图中的代码提供了一个如何做到这一点的例子。
- 首先,我们要表示的整数被输入为
np.range(0,len(amz_df),250)。请注意,代码中没有输入整数,而是使用了np.range()函数来产生这些整数。分别运行np.range(0,len(amz_df),250)并研究其输出。 - 其次,替换的对应物,也就是这些交易日的日期,也被引入到
plt.xticks()中。它们是用amz_df中的Date列引入的。amz_df.Date[0:len(amz_df):250]代码确保替换的表示方法是它们在整数表示中的相关对应物。请注意--我们使用了amz_df,因为我们知道amz_df和apl_df的日期列是相同的。

请注意,前面的代码中的数字250是通过试验和错误得出的。我们正在寻找一个不会使xticks过于拥挤或过于稀疏的增量。试着用其他的增量运行代码,研究一下视觉的行为。
2.4 修改标记
我们在这里介绍的唯一使用标记的视觉效果是散点图。要修改标记的颜色和形状,你所需要做的就是在执行plt.scatter()时指定它们。这个函数需要两个输入,它用来按照你想要的方式绘制视觉效果。标记的输入是你要画的标记的形状,而颜色的输入是它的颜色。下面的截图显示了如何通过输入marker='x'和color='green'将Matplotlib散点图的默认蓝点改为绿色十字。由于书是以灰度打印的,所以你无法在打印中看到颜色的变化,但如果你自己尝试一下这段代码,你会看到颜色的变化。
该代码还展示了另一个使用plt.title()、plt.xlabel()和plt.ylabel()来修改视觉的标题和轴的标签的例子。

有许多标记的形状和标记的颜色选项可以供你使用。 到目前为止,我们已经学会了如何使用Matplotlib创建视觉效果和修改它们。接下来,我们将学习另一个有用的函数,它允许我们将多个视觉效果组织在一起。
matplotlib.markers — Matplotlib 3.5.3 documentation
All possible markers are defined here:
| marker | symbol | description |
|---|---|---|
| "." | ![]() |
point |
| "," | ![]() |
pixel |
| "o" | ![]() |
circle |
| "v" | ![]() |
triangle_down |
| "^" | ![]() |
triangle_up |
| "<" | ![]() |
triangle_left |
| ">" | ![]() |
triangle_right |
| "1" | ![]() |
tri_down |
| "2" | ![]() |
tri_up |
| "3" | ![]() |
tri_left |
| "4" | ![]() |
tri_right |
| "8" | ![]() |
octagon |
| "s" | ![]() |
square |
| "p" | ![]() |
pentagon |
| "P" | ![]() |
plus (filled) |
| "*" | ![]() |
star |
| "h" | ![]() |
hexagon1 |
| "H" | ![]() |
hexagon2 |
| "+" | ![]() |
plus |
| "x" | ![]() |
x |
| "X" | ![]() |
x (filled) |
| "D" | ![]() |
diamond |
| "d" | ![]() |
thin_diamond |
| "|" | ![]() |
vline |
| "_" | ![]() |
hline |
3 子图
绘制子图可以是一个非常有用的数据分析和数据预处理工具。当我们想填充一个以上的视觉,并以特定的方式将它们组织在一起时,我们会使用子图。
下面的屏幕截图显示了一个子图的例子。在Matplotlib中创建子图的逻辑是独特而有趣的。为了绘制子图,你首先需要计划并决定你打算拥有的视觉效果的数量以及它们的矩阵式组织。例如,下面的例子有两个视觉,视觉被组织成一个两行一列的矩阵。一旦你知道了这些,你就可以开始编码了。
让我们一起一步一步来:
- Matplotlib子图的逻辑是,你用一行代码来宣布你即将开始给每个特定的视觉提供代码。
plt.subplot(2,1,1)一行表示你想有一个两行一列的子图,你即将为第一个视觉运行代码。 - 一旦你完成了第一个可视化,你就运行另一个
plt.subplot(),但这一次你宣布你打算开始另一个可视化。例如,通过运行plt.subplot(2,1,2),你宣布你已经完成了第一个视觉,你将开始引入第二个视觉。
请注意,plt.subplot()的前两个输入在整个子图绘制过程中保持不变,因为它们指定了子图的矩阵式组织,而且它们应该始终保持不变。
plt.tight_layout()函数最好在你完成了所有的视觉效果并准备显示整个子图时使用。这个函数可以确保每个视觉效果都在自己的边界内,并且没有重叠的地方。在没有plt.tight_layout()的情况下运行下面的代码块,并研究其差异。

到目前为止,我们已经学会了如何绘制和设计视觉效果,然后修改它们。
然而,我们还没有学会如何调整它们的大小,以便使它们适合我们的需要。接下来,我们将学习如何调整大小并将其保存在我们的电脑上。
subplot2grid
matplotlib.pyplot.subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)[source]
在一个常规网格内的特定位置创建一个轴。
参数。
shape : 2个ints的序列
要放置轴的网格形状。第一个条目是行的数量,第二个条目是列的数量。
loc : 2个整数的序列
将轴放在网格中的位置。第一个条目是行数,第二个条目是列数。
rowspan : int
轴向右延伸的行数。
colspan : int
轴向下延伸的列的数量。
import matplotlib.pyplot as plt
def annotate_axes(fig):
for i, ax in enumerate(fig.axes):
ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center")
ax.tick_params(labelbottom=False, labelleft=False)
fig = plt.figure()
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3, 3), (2, 0))
ax5 = plt.subplot2grid((3, 3), (2, 1))
annotate_axes(fig)
plt.show()

4 调整视觉图像的大小并保存
用任何你想要的分辨率来保存Matplotlib的视觉效果是非常简单的。
然而,在调整分辨率和保存视觉效果之前,你可能想调整视觉效果的大小。让我们先来看看如何调整视觉的大小,然后再看看如何以特定的分辨率保存视觉。
4.1 重设大小
Matplotlib对其所有的视觉输出使用默认的视觉尺寸(6x4英寸),不时地,你可能想调整视觉的尺寸(特别是如果你有子图,因为你可能需要一个更大的输出)。要调整视觉尺寸,最简单的方法是运行plt.figure(figsize=(6,4)),然后再开始请求任何视觉效果。当然,添加上述代码不会改变尺寸,因为输入的值与Matplotlib的默认尺寸相同。为了观察差异,在前面截图的代码中加入plt.figure(figsize=(9,6)),并运行它来研究差异。另外,改变几次数值,找到最适合你的数值。
4.2 保存
你需要用来保存和调整输出数字的分辨率的就是plt.savefig()函数。这个函数接收你想创建的用于保存视觉效果的文件名,以及它的分辨率,即每英寸点数(DPI)。一个图形的DPI值越高,其分辨率就越高。例如,运行plt.savefig('visual.png',dpi=600)会把视觉效果保存在你的电脑中一个名为visual.png的文件中,该文件位于你的Jupyter笔记本文件所在的同一目录下。
当然,保存的视觉文件的DPI分辨率将是600。
4.3 Matplotilb协助数据预处理的例子
了解一个新的数据集的一个很好的方法是将其列可视化。数字列最好用直方图或膨胀图进行可视化。然而,这两者的结合是最好的,特别是当boxplot是垂直绘制的时候。使用Matplotlib的subplot函数,以2x5矩阵式的视觉效果绘制adult_df的所有数字列的直方图和boxplot。确保每一列的直方图和boxplot都在同一个子图列中。同时,将视觉效果保存在一个名为ColumnsVsiaulization.png的文件中,分辨率为900DPI。

运行代码后,如果成功执行,检查你的Jupyter笔记本文件所在的目录,ColumnsVisualization.png文件必须被添加到那里。打开该文件,享受由Matplotlib创建的高质量视觉效果。

5 pairplot绘制成对关系图
在一个数据集中绘制成对关系图。
默认情况下,该函数将创建一个Axes网格,这样,数据中的每个数字变量将在Y轴上的单行和X轴上的单列中共享。对角线图的处理方式不同:绘制单变量分布图以显示每一列中数据的边际分布。
也可以在行和列上显示一个变量子集或绘制不同的变量。
import seaborn as sns
sns.pairplot(df)



























浙公网安备 33010602011771号