一、前言
ChatGPT:
Matplotlib是一个广泛使用的Python绘图库,它提供了丰富的绘图功能,包括2D和3D绘图。在绘制3D图形方面,Matplotlib提供了一个子模块,名为mpl_toolkits.mplot3d,用于创建和展示三维图形。 要使用Matplotlib进行3D绘图,首先需要导入必要的模块。通常,我们导入
matplotlib.pyplot
和mpl_toolkits.mplot3d
模块。然后,可以创建一个3D图形对象,例如fig = plt.figure()
。接下来,我们可以创建一个3D坐标轴对象,使用ax = fig.add_subplot(111, projection='3d')
。这个坐标轴对象将用于绘制和控制3D图形的各个方面。 一旦创建了3D坐标轴对象,我们可以使用它的方法来绘制各种3D图形,例如散点图、线图、曲面图等。常用的方法包括plot()
、scatter()
、plot_surface()
等。这些方法接受三维坐标作为输入,并根据提供的数据绘制相应的图形。 除了绘制基本的3D图形之外,Matplotlib还提供了许多其他功能,如设置坐标轴范围、添加标签和标题、设置颜色映射等。你可以根据具体的需求和数据特点来使用这些功能,以创建出令人满意的3D图形。
本文将对3d绘图进行总结(持续更新),具体代码解析可参考专栏:
Matplotlib_QomolangmaH的博客-CSDN博客
https://blog.csdn.net/m0_63834988/category_12441299.html
二、环境介绍
matplotlib | 3.5.3 | |
---|---|---|
numpy | 1.21.6 | |
python | 3.7.16 |
- 运行下述命令检查Python版本
python --version
- 运行下述代码检查Python、NumPy、Matplotlib版本
import sys
import numpy as np
import matplotlib
print("Python 版本:", sys.version)
print("NumPy 版本:", np.__version__)
print("matplotlib 版本:", matplotlib.__version__)
三、Matplotlib绘图(3d)
0. 设置中文字体
代码语言:javascript复制import matplotlib
matplotlib.rcParams['font.family'] = 'Microsoft YaHei' # 设置为微软雅黑字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
若不进行该设置,会报错字体缺失
1. 3D线框图(3D Wireframe Plot)
代码语言:javascript复制import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# 生成数据
x = np.linspace(-5, 5, 50) # x轴坐标
y = np.linspace(-5, 5, 50) # y轴坐标
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 Y**2)) # z轴坐标,这里使用sin函数生成一个曲面
# 创建一个三维坐标系
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制线框图
ax.plot_wireframe(X, Y, Z)
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()
2. 3D散点图(3D Scatter Plot)
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.random.rand(100) # x轴数据
y = np.random.rand(100) # y轴数据
z = np.random.rand(100) # z轴数据
colors = np.random.rand(100) # 颜色数据
# 创建3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D散点图
ax.scatter(x, y, z, c=colors, cmap='viridis', marker='o')
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()
3. 3D条形图(3D Bar Plot)
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.arange(3) # x轴位置
y = np.arange(3) # y轴位置
x_mesh, y_mesh = np.meshgrid(x, y) # 创建网格
z = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 条形的高度
# 创建3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D条形图
ax.bar3d(x_mesh.flatten(), y_mesh.flatten(), np.zeros_like(z).flatten(), 0.5, 0.5, z.flatten())
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()
4. 3D曲面图(3D Surface Plot)
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.linspace(-5, 5, 100) # x轴数据范围
y = np.linspace(-5, 5, 100) # y轴数据范围
x_mesh, y_mesh = np.meshgrid(x, y) # 创建网格
z = np.sin(np.sqrt(x_mesh**2 y_mesh**2)) # 曲面高度
# 创建3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D曲面图
ax.plot_surface(x_mesh, y_mesh, z, cmap='viridis')
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()
5. 3D等高线图(3D Contour Plot)
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.linspace(-5, 5, 100) # x轴数据范围
y = np.linspace(-5, 5, 100) # y轴数据范围
x_mesh, y_mesh = np.meshgrid(x, y) # 创建网格
z = np.sin(np.sqrt(x_mesh**2 y_mesh**2)) # 曲面高度
# 创建3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D等高线图
ax.contour3D(x_mesh, y_mesh, z, 50, cmap='viridis')
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()
6. 3D向量场图(3D Vector Field Plot)
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.linspace(-2, 2, 10) # x轴数据范围
y = np.linspace(-2, 2, 10) # y轴数据范围
z = np.linspace(-2, 2, 10) # z轴数据范围
x_mesh, y_mesh, z_mesh = np.meshgrid(x, y, z) # 创建网格
u = np.sin(x_mesh) * np.cos(y_mesh) * np.cos(z_mesh) # x方向分量
v = -np.cos(x_mesh) * np.sin(y_mesh) * np.cos(z_mesh) # y方向分量
w = np.sqrt(2.0 / 3.0) * np.cos(x_mesh) * np.cos(y_mesh) * np.sin(z_mesh) # z方向分量
# 创建3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D向量场图
ax.quiver(x_mesh, y_mesh, z_mesh, u, v, w)
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()
7. 3D表面投影图(3D Surface Projection Plot)
代码语言:javascript复制import matplotlib.pyplot as plt
import numpy as np
# 数据准备
x = np.linspace(-2, 2, 100) # x轴数据范围
y = np.linspace(-2, 2, 100) # y轴数据范围
x_mesh, y_mesh = np.meshgrid(x, y) # 创建网格
z = np.sin(x_mesh) * np.cos(y_mesh) # z轴数据
# 创建3D图形对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D表面投影图
ax.plot_surface(x_mesh, y_mesh, z, cmap='viridis')
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()
8. 3D饼图(3D Pie Chart)
代码语言:javascript复制import matplotlib.pyplot as plt
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
colors = ['red', 'blue', 'green', 'yellow']
explode = (0, 0.1, 0, 0) # 用于突出显示某个扇区
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=45)
plt.title('3D饼图')
plt.show()
9. 3D等高线投影图(3D Contour Projection Plot)
代码语言:javascript复制import numpy as np
import matplotlib.pyplot as plt
# 准备数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 Y**2))
# 创建3D图像对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 生成等高线投影图
ax.contour(X, Y, Z, cmap='viridis')
# 添加标签和标题
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D Contour Projection Plot')
# 显示图像
plt.show()
10. 3D箱线图(3D Box Plot)
代码语言:javascript复制import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 准备数据
np.random.seed(123)
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)
z = np.random.normal(0, 1, 100)
# 创建3D图像对象
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D Box Plot
ax.boxplot([x, y, z])
# 添加标签和标题
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D Box Plot')
# 显示图像
plt.show()
11. 未完待续
四、绘图合集
代码语言:javascript复制import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
x = np.linspace(-5, 5, 20) # x轴坐标
y = np.linspace(-5, 5, 20) # y轴坐标
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 Y**2)) # z轴坐标,这里使用sin函数生成一个曲面
# 创建一个2x5的子图布局
fig, axs = plt.subplots(2, 4, figsize=(16, 8), subplot_kw={'projection': '3d'})
# 1. 3D线框图(3D Wireframe Plot)
axs[0, 0].plot_wireframe(X, Y, Z)
axs[0, 0].set_title("3D Wireframe Plot")
# 2. 3D散点图(3D Scatter Plot)
colors = np.random.rand(400) # 颜色数据
axs[0, 1].scatter(X, Y, Z, c=colors, cmap='viridis', marker='o')
axs[0, 1].set_title("3D Scatter Plot")
# 3. 3D条形图(3D Bar Plot)
x = np.arange(3) # x轴位置
y = np.arange(3) # y轴位置
x_mesh, y_mesh = np.meshgrid(x, y) # 创建网格
z = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 条形的高度
# 绘制3D条形图
axs[0, 2].bar3d(x_mesh.flatten(), y_mesh.flatten(), np.zeros_like(z).flatten(), 0.5, 0.5, z.flatten())
axs[0, 2].set_title("3D Bar Plot")
# 4. 3D曲面图(3D Surface Plot)
axs[0, 3].plot_surface(X, Y, Z)
axs[0, 3].set_title("3D Surface Plot")
# 5. 3D等高线图(3D Contour Plot)
axs[1, 0].contour3D(X, Y, Z)
axs[1, 0].set_title("3D Contour Plot")
# 6. 3D向量场图(3D Vector Field Plot)
U = np.cos(X)
V = np.sin(Y)
W = X Y
axs[1, 1].quiver(X, Y, Z, U, V, W)
axs[1, 1].set_title("3D Vector Field Plot")
# 7. 3D表面投影图(3D Surface Projection Plot)
axs[1, 2].contourf(X, Y, np.sin(X) * np.cos(Y), zdir='z', offset=-2)
axs[1, 2].set_title("3D Surface Projection Plot")
# 8. 3D箱线图(3D Box Plot)
data = np.random.randn(100, 3)
axs[1, 3].boxplot(data)
axs[1, 3].set_title("3D Box Plot")
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()