前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【中秋节快乐】Matplotlib:3d绘图合集

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

作者头像
Qomolangma
发布2024-07-30 08:36:20
1110
发布2024-07-30 08:36:20
举报
文章被收录于专栏:深度学习

一、前言

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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、环境介绍
  • 三、Matplotlib绘图(3d)
    • 0. 设置中文字体
      • 1. 3D线框图(3D Wireframe Plot)
        • 2. 3D散点图(3D Scatter Plot)
          • 3. 3D条形图(3D Bar Plot)
            • 4. 3D曲面图(3D Surface Plot)
              • 5. 3D等高线图(3D Contour Plot)
                • 6. 3D向量场图(3D Vector Field Plot)
                  • 7. 3D表面投影图(3D Surface Projection Plot)
                    • 8. 3D饼图(3D Pie Chart)
                      • 9. 3D等高线投影图(3D Contour Projection Plot)
                        • 10. 3D箱线图(3D Box Plot)
                          • 11. 未完待续
                          • 四、绘图合集
                          相关产品与服务
                          腾讯云代码分析
                          腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档