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 对象(取决于nrows
、ncols
和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)
散点图用于显示两个变量之间的关系。每个数据点表示一个观测值,其位置由两个变量的值决定。散点图通常用于检查两个变量之间是否存在某种关系或趋势。
绘制示例:
标签:set,函数,Python,子图,Matplotlib,plt,matplotlib,绘制 From: https://blog.csdn.net/2301_77084486/article/details/143191385import 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()