【中秋节快乐】Matplotlib:3d绘图合集

2024-07-30 08:36:20 浏览数 (2)

一、前言

ChatGPT:

Matplotlib是一个广泛使用的Python绘图库,它提供了丰富的绘图功能,包括2D和3D绘图。在绘制3D图形方面,Matplotlib提供了一个子模块,名为mpl_toolkits.mplot3d,用于创建和展示三维图形。 要使用Matplotlib进行3D绘图,首先需要导入必要的模块。通常,我们导入matplotlib.pyplotmpl_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版本
代码语言:javascript复制
 python --version 
  • 运行下述代码检查Python、NumPy、Matplotlib版本
代码语言:javascript复制
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()

0 人点赞