matplotlib

本文最后更新于:2024年5月25日 晚上

matplotlib

Matplotlib 首次发布于2007 年,因其在函数设计方面参考了Matlab,所以其名字以“Mat”开 头,中间的“plot”表示绘图的作用,结尾的“lib”表明它是一个集合。近年来,Matplotlib 库是Python 中绘制二维、三维图表的数据可视化工具,在科学计算领域被得到了广泛应用,具有以下突出优点: 使用简单绘图语言实现复杂绘图;以交互式操作实现数据可视化;采用嵌入式Latex 输出图表、表达式以及文本;实现对图像元素的精细化控制;可输png、eps 等多种格式;

pyplot 基础语法

pyplot 是 matplotlib 的内部模块,包含各种命令风格函数,它提供了操作 matplotlib 库的经典python 编程接口,具有单独的命名空间。本实验选择使用pyplot 模块作为主要工具进行图形绘制,学习使用pyplot 绘制各类图表的基础语法是图像绘制的前提。大部分pyplot 图形绘制都遵循一个固定的流程模式,通过这个流程就可以完成基础图表的绘制。pyplot 基本绘图流程如图所示:

img

上述流程图第一部分主要作用是创建一个空白画布,并可以选择是否将空白画布划分为多个部分,以便在同一幅图上绘制多个子图。若只需要绘制一个简单的图形,便不需考虑这一部分的内容。

创建画布

在实际绘图过程中,创建画布以及选中子图的函数如图 所示:

img

其中添加标题、添加x/y 坐标轴以及绘制图形不分先后顺序。可以先绘制图形,也可以先添加各类标签。

绘制图形以及添加各类标签

常用函数:

img

保存以及显示图形

常用函数:

img

根据上述示意流程图参考以及不同模块绘图语言相互配合调用,可进行图形简易绘制。

这只是一些Matplotlib.pyplot功能的基础示例。Matplotlib.pyplot提供了许多其他函数和选项,可用于自定义图表的外观、样式、标签等。参考Matplotlib的官方文档以获取更多详细信息和示例:Matplotlib文档

示例

1.散点图

代码实现:

1
2
3
4
5
6
7
8
9
10
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0.05,10,100)
y=np.random.rand(100)
plt.scatter(x,y,label='scatter figure')
plt.title('scatter figure')
plt.xlim(0.05,10)
plt.ylim(0,1)
plt.show()

代码逻辑:

1.使用numpylinspace函数生成一个从0.05到10的等差数列,包含100个元素。这个数列将用作散点图中的x坐标。

2.使用numpyrandom.rand函数生成一个包含100个元素的随机数数组,这些数将用作散点图中的y坐标。

3.调用plt.scatter函数绘制散点图,传入x和y坐标数组,并设置标签为scatter figure

4.调用plt.title函数为图表添加标题scatter figure

5.使用plt.xlimplt.ylim函数设置x轴和y轴的显示范围。x轴的范围是0.05到10,y轴的范围是0到1。

6.调用plt.show函数显示绘制的散点图。

结果:

img

2.折线图

代码实现:

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(0.0,10,40)
y=np.random.randn(40)
plt.plot(x,y,ls='-',lw=2,marker='o',ms=10,mfc='red',alpha=0.5)
plt.show()

代码逻辑:

1.使用numpylinspace函数生成一个从0.0到10的等差数列,包含40个元素。这个数列将用作线图中的x坐标。

2.使用numpyrandom.randn函数生成一个包含40个元素的随机数数组,这些数将用作线图中的y坐标。random.randn生成的是标准正态分布的随机数。

3.调用plt.plot函数绘制线图,传入x和y坐标数组,并设置以下参数:ls=’-‘:线条样式为实线。lw=2:线条宽度为2。marker=’o’:标记样式为圆形。ms=10:标记大小为10。mfc=’red’:标记填充颜色为红色。alpha=0.5:透明度为0.5。

4.最后,调用plt.show函数显示绘制的线图。

结果:

img

3.平面函数

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,1.1,0.01)
plt.xlabel('x') #添加x轴名称
plt.ylabel('y') #添加y轴名称
plt.title('y=lines(x)')#添加标题

plt.xlim((0,1)) #设定x轴范围
plt.ylim((0,1)) #设定y轴范围
plt.xticks([0,0.2,0.4,0.6,0.8,1])#设定x轴范围
plt.yticks([0,0.2,0.4,0.6,0.8,1])#设定y轴范围

plt.plot(x,x)#绘制y=x曲线
plt.plot(x,x**3)#绘制y=x^3曲线
plt.legend(['y=x','y=x^3'])
plt.show()

代码逻辑:

1.使用numpyarange函数生成一个从0到2.1的等差数列,包含21个元素,步长为0.1。这个数列将用作图表中的x坐标。

2.计算四个幂函数的y值:

3.调用plt.plot函数绘制四个曲线:第一个参数是x坐标数组,第二个参数是y坐标数组,这里绘制的是y1。第三个参数是线条样式,这里设置为实线。第四个参数是线条宽度,这里设置为3。第五个参数是图例标签,这里使用了LaTeX数学表达式。

4.调用plt.legend函数添加图例,设置以下参数:title="Power function":图例的标题。loc="upper left":图例的位置,位于图表的左上角。bbox_to_anchor=(0.05,0.95):设置图例的锚点位置,即图例相对于图表的位置。shadow=True:显示图例的阴影。fancybox=True:使用更美观的图例框。

结果:

img

4.气泡图

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
import matplotlib.pyplot as plt
import matplotlib as mp
import numpy as np

x=np.random.randn(100)
y=np.random.randn(100)
s=np.power(5*x+10*y,2)
c=np.random.rand(100)
cm=mp.cm.RdYlBu
marker='o'
plt.scatter(x,y,s=s,c=c,cmap=cm)
plt.show()

代码逻辑:

1.使用numpyrandom.randn函数生成两个包含100个元素的随机数数组,分别作为散点图中的x和y坐标。

2.使用numpypower函数计算一个包含100个元素的数组,这些数是5x + 10y的平方。这个数组将用作散点图中每个点的面积(大小)。

3.使用numpyrandom.rand函数生成一个包含100个元素的随机数数组,作为散点图中每个点的颜色。

4.调用matplotlib.cm.RdYlBu获取一个颜色映射对象,该对象定义了颜色空间的转换。

5.调用plt.scatter函数绘制散点图,传入x和y坐标数组,以及大小和颜色数组,并设置参数:s=s:设置每个点的面积(大小)。c=c:设置每个点的颜色。cmap=cm:设置颜色映射对象,用于根据点的颜色数组生成实际的RGB颜色。marker='o':设置标记样式为圆形。

6.最后,调用plt.show函数显示绘制的散点图。

结果:

img

5.三维曲线

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
# ax = fig.gca(projection = '3d')
ax = fig.add_subplot(projection = '3d')
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z, label='3D curve')
ax.legend()
plt.show()

代码逻辑:

1.设置matplotliblegend.fontsize为10,以调整图例的字体大小。

2.创建一个新的图表fig

3.使用fig.add_subplot函数添加一个Axes3D对象,并设置projection='3d'参数以创建一个三维坐标轴。

4.使用np.linspace函数生成一个从-4π到4π的等差数列,包含100个元素,作为角度theta的值。

5.使用np.linspace函数生成一个从-2到2的等差数列,包含100个元素,作为z轴的值。

6.计算r轴的值,它是z轴值的平方加上1。计算x轴和y轴的值,它们分别是r轴值的sin和cos。

7.调用ax.plot函数绘制三维曲线,传入x、y、z坐标数组,并设置标签为’3D curve’

8.调用ax.legend函数添加图例,并设置字体大小为10。

9.最后,调用plt.show函数显示绘制的图表。

结果:

img

6.3D函数

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import matplotlib.pyplot as plt
import numpy as np
# 创建一个 figure
fig = plt.figure()
# 创建一个 3D 轴
ax = fig.add_subplot(111, projection='3d')
# 定义 x 和 y 的值
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
# 计算 z 的值
z = x**2 + y**2
# 绘制曲面图
ax.plot_surface(x, y, z, cmap='viridis')
# 设置标题和标签
ax.set_title('3D Surface Plot of z = x^2 + y^2')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')

plt.show()

代码逻辑:

1.创建图形和3D轴:这里的fig是一个图形对象,ax是一个3D轴对象,用于后续的绘图。

2.定义x和y的数据:np.linspace生成了x和y的数据点,范围从-5到5,共100个点。np.meshgrid则将这些数据点转换成网格形式,以便用于计算z的值。

3.计算z的值:这里的z是根据函数z = x^2 + y^2计算得到的,它将形成一个圆形的碗状曲面。

4.绘制曲面图:plot_surface函数使用x, y, z的数据来绘制一个曲面图,cmap参数指定了颜色映射。

5.设置标题和标签:这些函数为图形添加了标题和轴标签,以便于理解。

6.最后,plt.show()被调用来显示图形。

整个代码的逻辑是将数学函数z = x^2 + y^2转换为3D图形,以便直观地展示函数的曲面形状。通过调整x和y的值以及函数表达式,可以探索不同的数学曲面。

结果:

img

MORE

这只是一些Matplotlib的基础示例。Matplotlib提供了许多其他图表和示例,可以下载源码自行修改,用于自定义图表的外观、样式、标签等。参考Matplotlib的官方示例:Matplotlib示例


matplotlib
https://forever0823.github.io/2024/05/25/matplotlib/
作者
Alan
发布于
2024年5月25日
许可协议