【Python数据分析】Matplotlib绘制不同的3D 图

专栏导读

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

Matplotlib 简介

  • Matplotlib 是 Python 中最流行的 2D 绘图库,用于创建高质量的静态、动态和交互式可视化。它最初由 John D. Hunter 于 2003 年创建,现已成为 Python 科学计算生态系统中的核心可视化工具。

主要特点

  • 多功能性:支持线图、散点图、条形图、直方图、饼图、等高线图、3D 图等多种图表类型
  • 高度可定制:几乎可以控制图形的每个元素(标题、标签、刻度、图例等)
  • 多平台支持:可在多种操作系统和图形后端上工作
  • 与其他库良好集成:与 NumPy、Pandas、SciPy 等科学计算库无缝协作
  • 多种输出格式:支持 PNG、PDF、SVG、EPS 等多种格式输出

基本架构

  • Matplotlib 采用分层架构:
  • Backend Layer:底层接口,处理不同输出格式和渲染
  • Artist Layer:中间层,处理图形元素(线、文本、图像等)
  • Scripting Layer (pyplot):顶层接口,提供类似 MATLAB 的简单绘图命令

基本组件

  • Figure:整个图形窗口,可以包含多个子图
  • Axes:实际的绘图区域,包含坐标轴、标签等
  • Axis:坐标轴对象,控制刻度、标签等
  • Artist:所有可见元素(文本、线条、矩形等)的基类

库的安装

  • Matplotlib的mplot3d工具包提供了多种3D数据可视化功能。下面介绍几种常见的3D图表类型及其实现方法。

用途安装
numpy数据生成pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/
matplotlib数据可视化pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/

1. 基本3D线图

在这里插入图片描述

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 创建数据
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)

# 创建3D图形
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D线图
ax.plot(x, y, z, label='3D螺旋线', linewidth=2)
ax.set_title('基本3D线图')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
ax.legend()

plt.tight_layout()
plt.show()

2. 3D散点图

在这里插入图片描述

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 生成随机数据
np.random.seed(42)
n = 100
x = np.random.rand(n)
y = np.random.rand(n)
z = np.random.rand(n)
colors = np.random.rand(n)
sizes = 1000 * np.random.rand(n)

# 创建图形
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D散点图
scatter = ax.scatter(x, y, z, c=colors, s=sizes, alpha=0.6, cmap='viridis')

# 添加颜色条
cbar = fig.colorbar(scatter, shrink=0.5, aspect=10)
cbar.set_label('颜色值')

ax.set_title('3D散点图')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.tight_layout()
plt.show()

3. 3D曲面图

在这里插入图片描述

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 创建网格数据
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))

# 创建图形
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D曲面
surf = ax.plot_surface(X, Y, Z, cmap='coolwarm',
                      linewidth=0, antialiased=True,
                      rstride=5, cstride=5, alpha=0.8)

# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=10)

ax.set_title('3D曲面图')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.tight_layout()
plt.show()

4. 3D线框图

在这里插入图片描述

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 创建网格数据
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))

# 使用上面的数据
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D线框图
wire = ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10,
                        color='darkblue', linewidth=1)

ax.set_title('3D线框图')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.tight_layout()
plt.show()

5. 3D等高线图

在这里插入图片描述

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 创建网格数据
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))

# 使用上面的数据
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D等高线图
ax.contour3D(X, Y, Z, 50, cmap='binary')

ax.set_title('3D等高线图')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.tight_layout()
plt.show()

6. 3D条形图

在这里插入图片描述

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 创建数据
x_pos = np.arange(4)
y_pos = np.arange(5)
x_pos, y_pos = np.meshgrid(x_pos, y_pos)
x_pos = x_pos.flatten()
y_pos = y_pos.flatten()
z_pos = np.zeros_like(x_pos)

dx = dy = 0.5 * np.ones_like(z_pos)
dz = np.random.rand(20)

# 创建图形
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D条形图
colors = plt.cm.viridis(dz / float(max(dz)))
ax.bar3d(x_pos, y_pos, z_pos, dx, dy, dz, color=colors, shade=True)

ax.set_title('3D条形图')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.tight_layout()
plt.show()

7. 3D参数曲线

在这里插入图片描述

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 创建数据
t = np.linspace(0, 2*np.pi, 100)
x = np.sin(t)
y = np.cos(t)
z = t

fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D参数曲线
ax.plot(x, y, z, label='螺旋线', linewidth=3)

ax.set_title('3D参数曲线')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
ax.legend()

plt.tight_layout()
plt.show()

8. 3D多边形

在这里插入图片描述

from matplotlib.patches import Polygon
import numpy as np
from matplotlib.collections import PolyCollection
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 创建 2D 多边形顶点
verts2d = np.random.rand(4, 2)

# 构造 PolyCollection 的顶点数据(加上 z=0)
verts3d = [list(map(lambda xy: (xy[0], xy[1], 0), verts2d))]

fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 使用 PolyCollection 添加到 3D 坐标轴中
poly3d = PolyCollection([verts2d], facecolors='cyan', edgecolors='k', linewidths=2, alpha=0.5)
ax.add_collection3d(poly3d, zs=0, zdir='z')

ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_zlim(0, 1)
ax.set_title('3D多边形')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.tight_layout()
plt.show()

9. 3D文本标注

在这里插入图片描述

from matplotlib.patches import Polygon
import numpy as np
from matplotlib.collections import PolyCollection
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 绘制3D散点
ax.scatter([0], [0], [0], color='r', s=100)

# 添加3D文本
ax.text(0, 0, 0, "原点", color='red', fontsize=12)
ax.text(1, 1, 1, "点(1,1,1)", color='blue', fontsize=12)

ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_zlim(-1, 1)
ax.set_title('3D文本标注')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

plt.tight_layout()
plt.show()


10. 3D动画

在这里插入图片描述


import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

# 创建数据
def get_3d_data(t):
    theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
    z = np.linspace(-2, 2, 100)
    r = z**2 + 1 + 0.5 * np.sin(t)
    x = r * np.sin(theta + t/10)
    y = r * np.cos(theta + t/10)
    return x, y, z

# 初始化图形
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
line, = ax.plot([], [], [], lw=2)

# 设置坐标轴范围
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.set_zlim(-2, 2)
ax.set_title('3D动画')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

# 动画更新函数
def update(t):
    x, y, z = get_3d_data(t)
    line.set_data(x, y)
    line.set_3d_properties(z)
    return line,

# 创建动画
ani = FuncAnimation(fig, update, frames=100, interval=50, blit=True)

plt.tight_layout()
plt.show()

# 如果要保存动画,取消下面注释
# ani.save('3d_animation.mp4', writer='ffmpeg', fps=30)

总结

  • 希望对初学者有帮助

  • 致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【一个免费关注】!感谢

  • 求个 🤞 关注 🤞

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 求个 ❤️ 喜欢 ❤️

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 求个 👍 收藏 👍

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小庄-Python办公

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值