Python包——Matplotlib

时间:2024-10-24 09:09:54

        Matplotlib 是 Python 中一个广泛使用的绘图库,它能够生成高质量的图表和图形。它提供了一个类似于 MATLAB 的绘图框架,使得数据可视化变得简单和直观。下面是一些关于如何使用 Matplotlib 的基础知识和示例。

1.常用API

1.1 绘图类型

函数名称 描述
Bar 绘制条形图
Barh 绘制水平条形图
Boxplot 绘制箱型图
Hist 绘制直方图
his2d 绘制2D直方图
Pie 绘制饼状图
Plot 在坐标轴上画线或者标记
Polar 绘制极坐标图
Scatter 绘制x与y的散点图
Stackplot 绘制堆叠图
Stem 用来绘制二维离散数据绘制(又称为火柴图)
Step 绘制阶梯图
Quiver 绘制一个二维按箭头

1.2 Image 函数

函数名称 描述
Imread 从文件中读取图像的数据并形成数组
Imsave 将数组另存为图像文件
Imshow 在数轴区域内显示图像

1.3 Axis 函数

函数名称 描述
Axes 在画布(Figure)中添加轴
Text 向轴添加文本
Title 设置当前轴的标题
Xlabel 设置x轴标签
Xlim 获取或者设置x轴区间大小
Xscale 设置x轴缩放比例
Xticks 获取或设置x轴刻标和相应标签
Ylabel 设置y轴的标签
Ylim 获取或设置y轴的区间大小
Yscale 设置y轴的缩放比例
Yticks 获取或设置y轴的刻标和相应标签

1.4 Figure 函数

函数名称 描述
Figtext 在画布上添加文本
Figure 创建一个新画布
Show 显示数字
Savefig 保存当前画布
Close

关闭画布窗口

2.pylab 模块

        pylab 是 matplotlib 中的一个模块,它将 matplotlib.pyplot 和 numpy 的功能组合在一起,使得你可以直接使用 numpy 的函数和 matplotlib.pyplot 的绘图功能,而不需要显式地导入 numpy 和 matplotlib.pyplot。

优点

  • 方便快捷:pylab 的设计初衷是为了方便快速绘图和数值计算,使得你可以直接使用 numpy 的函数和 matplotlib.pyplot 的绘图功能,而不需要显式地导入 numpy 和 matplotlib.pyplot。

  • 简化代码:使用 pylab 可以减少导入语句的数量,使代码更简洁。

缺点

  • 命名空间污染:pylab 将 numpy 和 matplotlib.pyplot 的功能组合在一起,可能会导致命名空间污染,使得代码的可读性和可维护性降低。

  • 不适合大型项目:对于大型项目或需要精细控制的项目,pylab 可能不够灵活。

3.常用函数

3.1 plot 函数

        pylab.plot 是一个用于绘制二维图形的函数。它可以根据提供的 x 和 y 数据点绘制线条和/或标记。它位于 matplotlib.pyplot 模块中,通常通过 plt.plot() 的形式被调用,其中 plt 是matplotlib.pyplot 的常用别名。plot 函数可以绘制线性和非线性数据关系,以及离散点。通过调整 plot 函数的参数,用户可以自定义线条的样式、颜色、标记等属性。

import matplotlib.pyplot as plt  
  
# 数据  
x = [1, 2, 3, 4, 5]  
y = [1, 4, 9, 16, 25]  
  
# 绘制图表  
plt.plot(x, y)  
  
# 显示图表  
plt.show()

在这个例子中,x 和 y 是两个列表,分别代表横坐标和纵坐标的数据点。plt.plot(x, y) 会根据这些数据点绘制一条折线图。

常用参数

  • linestyle 或 ls:指定线条的样式,如实线(-)、虚线(--)、点线(:)或点划线(-.)。
  • color 或 c:指定线条的颜色,可以是字符串形式的颜色名(如 'red''blue'),也可以是 RGB 或 RGBA 元组。
  • marker:指定数据点的标记样式,如点(.)、圆圈(o)、星号(*)等。
  • markersize 或 ms:指定数据点标记的大小。
  • label:为线条指定一个标签,用于图例的显示。
import matplotlib.pyplot as plt  
  
# 数据  
x = [1, 2, 3, 4, 5]  
y1 = [1, 4, 9, 16, 25]  
y2 = [2, 3, 5, 7, 11]  
  
# 绘制两条线条,并设置不同的样式和颜色  
plt.plot(x, y1, label='y1', linestyle='--', color='blue', marker='o')  
plt.plot(x, y2, label='y2', linestyle='-', color='red', marker='*')  
  
# 添加标题和坐标轴标签  
plt.title("Example Plot")  
plt.xlabel("x")  
plt.ylabel("y")  
  
# 添加图例  
plt.legend()  
  
# 显示图表  
plt.show()

3.2 figure 函数

  figure 函数是用于创建一个新的图形窗口或激活一个已存在的图形窗口的主要函数。这个函数位于 matplotlib.pyplot 模块中,并且通常通过 plt.figure() 的形式被调用,figure 函数允许用户指定图形的大小、分辨率、背景颜色等属性,并且返回一个 Figure 对象,该对象可以被用来进一步定制图形,如添加子图(axes)、标题、图例等。

常用参数

  • num:图形的编号或名称。如果指定了一个已经存在的编号或名称,那么 figure 函数将激活那个图形窗口,而不是创建一个新的。
  • figsize:一个元组,指定图形的大小(宽度,高度),单位为英寸。
  • dpi:图形的分辨率,即每英寸的点数(dots per inch)。
  • facecolor:图形的背景颜色。
  • edgecolor:图形的边框颜色。
import matplotlib.pyplot as plt  
  
# 创建一个新的图形窗口,指定大小为 8x6 英寸,分辨率为 100 dpi  
fig = plt.figure(figsize=(8, 6), dpi=100)  
  
# 在图形窗口中添加一个子图,并绘制数据  
ax = fig.add_subplot(111)  
ax.plot([1, 2, 3, 4], [1, 4, 9, 16], label='y=x^2')  
  
# 添加标题和坐标轴标签  
ax.set_title('Example Plot')  
ax.set_xlabel('x')  
ax.set_ylabel('y')  
  
# 添加图例  
ax.legend()  
  
# 显示图形  
plt.show()

3.3 标题中文乱码

如果标题设置的是中文,会出现乱码

局部处理:

from matplotlib.font_manager import _rebuild
_rebuild()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

全局处理:

首先,找到 matplotlibrc 文件的位置,可以使用以下代码:

import matplotlib
print(matplotlib.matplotlib_fname())

然后,修改 matplotlibrc 文件,找到 font.family 和 font.sans-serif 项,设置为支持中文的字体,如 SimHei。

同时,设置 axes.unicode_minus 为 False 以正常显示负号。

修改完成后,重启pyCharm。如果不能解决,尝试运行以下代码来实现:

from matplotlib.font_manager import _rebuild
_rebuild()

3.4 subplot 函数

  subplot 函数是用于在同一个图形窗口中创建多个子图(axes)的函数。subplot 函数允许用户指定子图的布局(即行数、列数以及当前子图的位置),并在指定的位置上创建一个子图。

subplot 函数的基本用法是 plt.subplot(nrows, ncols, index),其中:

  • nrows:子图的行数。
  • ncols:子图的列数。
  • index:当前子图的位置编号,从左到右、从上到下开始计数,编号从 1 开始。

        另外,subplot 函数也接受一个三位数的快捷方式,其中第一个数字是行数(十位),第二个数字是列数(个位),第三个数字是位置编号(百位上的数字忽略,只考虑个位和十位)。例如,plt.subplot(235) 相当于 plt.subplot(2, 3, 5),表示在一个 2 行 3 列的子图布局中创建第 5 个子图。

import matplotlib.pyplot as plt  
  
# 使用三位数快捷方式创建一个 2 行 2 列的子图布局,并在第 1 个位置创建子图  
plt.subplot(221)  
plt.plot([1, 2, 3], [1, 4, 9])  
  
# 在第 2 个位置创建子图  
plt.subplot(222)  
plt.plot([1, 2, 3], [1, 2, 3])  
  
# 在第 3 个位置创建子图  
plt.subplot(223)  
plt.plot([1, 2, 3], [9, 4, 1])  
  
# 在第 4 个位置创建子图  
plt.subplot(224)  
plt.plot([1, 2, 3], [3, 2, 1])  
  
# 显示图形  
plt.show()

在这个例子中,我们使用三位数快捷方式创建了一个 2 行 2 列的子图布局,并在每个位置上分别绘制了一条折线图。

3.5 subplots 函数

subplots 是 matplotlib.pyplot 模块中的一个函数,用于创建一个包含多个子图(subplots)的图形窗口。subplots 函数返回一个包含所有子图的数组,这使得你可以更方便地对每个子图进行操作。 

subplots 函数的基本用法是 plt.subplots(nrows=1, ncols=1, figsize=None, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw),其中:

  • nrows 和 ncols 分别指定子图的行数和列数。
  • figsize 是一个元组,指定图形窗口的大小(宽度,高度),单位为英寸。
  • sharex 和 sharey 分别指定是否共享 x 轴和 y 轴。
  • squeeze 指定当 nrows=1 或 ncols=1 时,是否返回单个 Axes 对象而不是 Axes 数组。
  • subplot_kw 是一个字典,用于传递给每个子图的 add_subplot 方法的关键字参数。
  • gridspec_kw 是一个字典,用于传递给 GridSpec 构造函数的关键字参数,以创建更复杂的子图布局。
  • **fig_kw 是传递给 Figure 构造函数的其他关键字参数。

subplots 函数返回一个元组 (fig, axs),其中 fig 是 Figure 对象,代表图形窗口,axs 是一个数组或单个 Axes 对象(取决于 nrowsncols 和 squeeze 参数),代表子图。

 

import matplotlib.pyplot as plt  
  
# 创建一个包含 2 行 2 列子图的图形窗口  
fig, axs = plt.subplots(2, 2)  
  
# 在第一个子图上绘制数据  
axs[0, 0].plot([1, 2, 3], [1, 4, 9])  
  
# 在第二个子图上绘制数据  
axs[0, 1].plot([1, 2, 3], [1, 2, 3])  
  
# 在第三个子图上绘制数据  
axs[1, 0].plot([1, 2, 3], [9, 4, 1])  
  
# 在第四个子图上绘制数据  
axs[1, 1].plot([1, 2, 3], [3, 2, 1])  
  
# 调整子图之间的间距(可选)  
plt.tight_layout()  
  
# 显示图形  
plt.show()

在这个例子中,我们创建了一个包含 2 行 2 列子图的图形窗口,并在每个子图上分别绘制了一条折线图。我们还使用了 plt.tight_layout() 函数来调整子图之间的间距,以确保它们不会重叠。

3.6 subplot2gird 函数

        subplot2grid 是 matplotlib.pyplot 模块中的一个函数,用于在网格中创建子图。subplot2grid 允许你更灵活地指定子图的位置和大小,以非等分的形式对画布进行切分,使得你可以创建复杂的布局。

语法

ax = plt.subplot2grid(shape, loc, rowspan=1, colspan=1)

参数

  • shape: 网格的形状,格式为 (rows, cols),表示网格的行数和列数,在figure中式全局设置。

  • loc: 子图的起始位置,格式为 (row, col),表示子图在网格中的起始行和列。

  • rowspan: 子图占据的行数,默认为 1。

  • colspan: 子图占据的列数,默认为 1。

3.7 grid 函数

        grid 是用于在图形中添加网格线的函数。网格线可以帮助读者更清晰地理解数据的分布和趋势。grid 函数可以应用于 Axes 对象,用于在子图中添加网格线。

语法

ax.grid(b=None, which='major', axis='both', **kwargs)

参数

  • b: 是否显示网格线,默认为 None,表示根据当前设置显示或隐藏网格线。

  • which: 指定要显示的网格线类型,可以是 'major'(主刻度)、'minor'(次刻度)或 'both'(主刻度和次刻度)。

  • axis: 指定要显示网格线的轴,可以是 'both'(两个轴)、'x'(X 轴)或 'y'(Y 轴)。

  • **kwargs: 其他可选参数,用于定制网格线的外观,如 color、linestyle、linewidth 等。

3.8 xscale 和 yscale 函数

        xscale 和 yscale 函数用于设置坐标轴的刻度类型。默认情况下,坐标轴的刻度类型是线性的,但你可以使用 xscale 和 yscale 函数将其更改为对数刻度或其他类型的刻度。

语法

ax.set_xscale(value)
ax.set_yscale(value)

参数

value: 刻度类型,可以是 'linear'(线性刻度)、'log'(对数刻度)、'symlog'(对称对数刻度)、'logit'(对数几率刻度)等。3

import matplotlib.pyplot as plt  
import numpy as np  
  
# 创建数据  
x = np.linspace(1, 100, 100)  
y = np.log10(x)  
  
# 创建图形和子图  
fig, ax = plt.subplots()  
  
# 绘制数据  
ax.plot(x, y)  
  
# 设置 x 轴为对数比例尺  
ax.xscale('log')  
  
# 显示图形  
plt.show()

在这个例子中,我们创建了一个线性空间的数据集 x,并计算了它的对数 y。然后,我们创建了一个图形和一个子图,并在子图上绘制了数据。最后,我们使用 ax.xscale('log') 将 x 轴的比例尺设置为对数。

3.9 set_xlim 和 set_ylim 函数

   set_xlim 和 set_ylim 函数用于设置图形中 x 轴和 y 轴的显示范围。这两个函数是 Axes 对象的方法,允许您指定轴的最小值和最大值,从而控制图形上数据的显示区域。

set_xlim 函数用于设置 x 轴的显示范围。它的一般用法是:

ax.set_xlim(left, right, emit=True, auto=False, **kwargs)
  • ax 是一个 Axes 对象,代表图形中的一个子图。
  • left 和 right 分别指定 x 轴的最小值和最大值。
  • emit 是一个布尔值,指定是否在设置范围时触发事件(通常不需要更改)。
  • auto 是一个布尔值,如果设置为 True,则会自动计算并设置 x 轴的范围(通常不使用,因为直接指定了范围)。
  • **kwargs 是传递给方法的其他关键字参数(通常不使用)。

set_ylim 函数与 set_xlim 类似,但用于设置 y 轴的显示范围。参数与 set_xlim 相同,但作用于 y 轴。

3.10 set_xticks 和 set_yticks 函数

        Matplotlib 可以自动根据因变量和自变量设置坐标轴范围,也可以通过 set_xticks() 和 set_yticks() 函数手动指定刻度,接收一个列表对象作为参数,列表中的元素表示对应数轴上要显示的刻度。

set_xticks 函数用于设置 x 轴的刻度位置。它的一般用法是:

ax.set_xticks(ticks, minor=False, **kwargs)
  • ax 是一个 Axes 对象,代表图形中的一个子图。
  • ticks 是一个列表或数组,指定 x 轴上应该显示的刻度值。
  • minor 是一个布尔值,如果设置为 True,则设置的是次要刻度(通常不需要更改,因为默认操作的是主要刻度)。
  • **kwargs 是传递给方法的其他关键字参数,可以用于设置刻度标签等其他属性(通常不使用,因为刻度标签通过 set_xticklabels 设置)

set_yticks 函数与 set_xticks 类似,但用于设置 y 轴的刻度位置,参数与 set_xticks 相同,但作用于 y 轴。

import matplotlib.pyplot as plt  
import numpy as np  
  
# 创建数据  
x = np.linspace(0, 10, 11)  # 注意这里我们生成了11个点,包括端点  
y = x ** 2  
  
# 创建图形和子图  
fig, ax = plt.subplots()  
  
# 绘制数据  
ax.plot(x, y, 'o-')  
  
# 设置 x 轴和 y 轴的刻度位置  
ax.set_xticks([0, 2, 4, 6, 8, 10])  
ax.set_yticks([0, 4, 16, 36, 64, 100])  
  
# 显示图形  
plt.show()

        在这个例子中,我们创建了一个从 0 到 10 的线性空间的数据集 x(包含11个点),并计算了它的平方值 y。然后,我们创建了一个图形和一个子图,并在子图上绘制了数据点。最后,我们使用 ax.set_xticks([0, 2, 4, 6, 8, 10]) 和 ax.set_yticks([0, 4, 16, 36, 64, 100]) 分别设置了 x 轴和 y 轴的刻度位置。

3..11 twinx 和 twiny 函数

   twinx 和 twiny 函数用于创建一个共享相同 x 轴或 y 轴但具有独立 y 轴或 x 轴的“孪生”轴。这些函数非常有用于在同一图形中绘制不同比例尺或不同数据类型的两条或多条曲线,而不需要使用不同的子图。

twinx 函数用于创建一个共享 x 轴但具有独立 y 轴的孪生轴。它的一般用法是:

ax2 = ax1.twinx()
  • ax1 是原始的 Axes 对象。
  • ax2 是返回的新 Axes 对象,它与 ax1 共享 x 轴,但有自己的 y 轴。

iny 函数与 twinx 类似,但用于创建一个共享 y 轴但具有独立 x 轴的孪生轴,参数与 twinx 相同,但创建的是共享 y 轴而独立 x 轴的孪生轴。

import matplotlib.pyplot as plt  
import numpy as np  
  
# 创建数据  
x = np.linspace(0, 10, 100)  
y1 = np.sin(x)  
y2 = np.exp(x / 20)  # 一个增长更快的函数,需要不同的比例尺  
  
# 创建图形和子图  
fig, ax1 = plt.subplots()  
  
# 在 ax1 上绘制第一条曲线  
ax1.plot(x, y1, 'b-')  
ax1.set_xlabel('X 轴')  
ax1.set_ylabel('sin(x)', color='b')  
  
# 创建共享 x 轴的孪生轴  
ax2 = ax1.twinx()  
  
# 在 ax2 上绘制第二条曲线  
ax2.plot(x, y2, 'r-')  
ax2.set_ylabel('exp(x/20)', color='r')  
  
# 显示图形  
plt.show()

3.12各种类型的图

        在 Matplotlib 库中,柱状图、直方图、饼图、折线图和散点图是五种常用的数据可视化图表类型。每种图表都有其特定的用途和绘制方法。以下是这些图表类型的简要介绍和绘制示例:

 柱状图(Bar Chart)

        柱状图用于显示不同类别的数据之间的比较。每个类别通常用一个垂直或水平的柱子表示,柱子的高度或长度代表该类别的数值。

绘制示例


import matplotlib.pyplot as plt 
import numpy as np 
	

categories = ['A', 'B', 'C', 'D'] 
values = [4, 7, 1, 8] 
plt.bar(categories, values) 
plt.xlabel('Categories') 
plt.ylabel('Values') 
plt.title('Bar Chart Example') 

plt.show()

 直方图(Histogram)

        直方图用于显示数据的分布情况。它将数据分成一系列连续的区间(或“桶”),并计算每个区间中的数据点数量。直方图通常用于显示连续变量的频率分布。

绘制示例

import matplotlib.pyplot as plt  
import numpy as np  
  
data = np.random.randn(1000)  # 生成正态分布的数据  
  
plt.hist(data, bins=30, edgecolor='black')  
plt.xlabel('Value')  
plt.ylabel('Frequency')  
plt.title('Histogram Example')  
plt.show()

饼图(Pie Chart)

        饼图用于显示一个整体中各部分所占的比例。整个饼图代表100%或某个总量,而饼图中的每个部分代表该总量中的一个组成部分。

绘制示例

import matplotlib.pyplot as plt  
  
sizes = [15, 30, 45, 10]  # 各部分的大小  
labels = ['A', 'B', 'C', 'D']  # 各部分的标签  
colors = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue']  # 各部分的颜色  
explode = (0.1, 0, 0, 0)  # 突出显示第一个部分  
  
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=140)  
plt.axis('equal')  # 确保饼图是圆形的  
plt.title('Pie Chart Example')  
plt.show()

折线图(Line Chart)

        折线图用于显示数据随时间或其他连续变量的变化趋势。数据点通过直线或曲线连接起来,以显示数据之间的连续性和趋势。

绘制示例

import matplotlib.pyplot as plt  
import numpy as np  
  
x = np.linspace(0, 10, 100)  
y = np.sin(x)  
  
plt.plot(x, y, label='sin(x)')  
plt.xlabel('X axis')  
plt.ylabel('Y axis')  
plt.title('Line Chart Example')  
plt.legend()  
plt.show()

散点图(Scatter Plot)

        散点图用于显示两个变量之间的关系。每个数据点表示一个观测值,其位置由两个变量的值决定。散点图通常用于检查两个变量之间是否存在某种关系或趋势。

绘制示例

import matplotlib.pyplot as plt  
import numpy as np  
  
x = np.random.rand(50)  
y = np.random.rand(50)  
  
plt.scatter(x, y, color='blue', alpha=0.5)  
plt.xlabel('X axis')  
plt.ylabel('Y axis')  
plt.title('Scatter Plot Example')  
plt.show()