[Matplotlib 教程] 如何用3D折线图直观展示多维数据变化

news/2024/9/24 1:23:33/

文章目录

  • 如何用3D折线图直观展示多维数据变化
    • 1 👩‍💻 主要思路:
    • 2 💡 代码亮点:
    • 3 📈 可应用的场景:
    • 4 ✨ 可视化小技巧:
    • 5 🚀 完整代码:

如何用3D折线图直观展示多维数据变化

在数据分析中,我们经常需要展示多个维度的数据变化。最近,我用Python的Matplotlib库绘制了一个非常直观的3D折线图,展示了不同维度的数据随时间的变化。这种图不仅能应用在深度学习模型的训练中,也适用于各种场景下的数据可视化!📊

3D折线图展示多维数据变化

1 👩‍💻 主要思路:

  1. 数据准备:首先,我根据不同维度的数据生成了一个网格,用来表示每个维度随时间或其他变量的变化。这里我举了深度学习的例子,将批次大小(Batch Size)、训练轮次(Epochs)和准确率(Accuracy)作为变量进行展示,但其实你可以替换为任何数据,比如销售量、时间和收入等。

  2. 3D折线图绘制:通过Matplotlib的3D绘图功能,可以展示任意两个维度与第三个维度的关系。每条线代表一个维度(如不同的批次大小、不同的时间点),并随着第三个维度(如准确率、收益)的变化绘制成曲线。

  3. 投影和填充:为了增强图形的可读性,我为每条3D曲线添加了投影,让数据在XY平面上也有所展示。通过多边形填充曲线和XY平面之间的区域,使数据的变化更加直观,视觉效果更好。

  4. 重点数据标注:在特定的数据点上(如某个时间点或特殊变量值),我用散点和数值标注突出显示这些数据,帮助你更清楚地了解不同维度下数据的具体变化。

2 💡 代码亮点:

下面这段代码用于绘制3D折线图,展示不同批次大小和训练轮次下的准确率变化。这里我用了Matplotlib的3D绘图工具包,通过设置不同的颜色映射和线宽,让图形更加美观。同时,我还用虚线连接了特定时间点下不同批次大小的准确率,帮助你更好地理解数据的变化趋势。

# 绘制3D图的核心代码
ax.plot(x_vals, [y]*len(x_vals), z_vals, label=f'Variable {y}', color=cmap(norm(y)), linewidth=line_width)
# 创建投影和填充区域
verts = [(x, y, z) for x, z in zip(x_vals, z_vals)]
verts += [(x, y, 0) for x in x_vals[::-1]]
poly = Poly3DCollection([verts], color=cmap(norm(y)), alpha=0.3)
ax.add_collection3d(poly)

3 📈 可应用的场景:

  • 时间序列数据:比如展示不同时段下某个产品的销售额变化。
  • 市场分析:对比不同地区、不同产品线的销售额趋势。
  • 金融数据:展示多个股票、基金或其他金融指标随时间的变化。
  • 科研分析:比如不同实验条件下测量值的变化。

4 ✨ 可视化小技巧:

  • 颜色映射(Colormap)可以让你一眼就看出不同维度的数据变化,图形更加清晰易读。
  • 可以重点标注某些特定数据点(如峰值、最低点),让数据分析更直观。

如果你正在处理多维度的数据,推荐大家试试这种3D折线图!它能帮你更好地理解数据随不同变量变化的趋势,适合应用于各类数据可视化场景!🧐

5 🚀 完整代码:

import matplotlib.pyplot as plt  # 导入matplotlib库用于绘制图形
from mpl_toolkits.mplot3d import Axes3D  # 导入3D绘图工具包
import numpy as np  # 导入numpy库用于数组和数值计算
import matplotlib.cm as cm  # 导入matplotlib的颜色映射模块
import matplotlib.colors as mcolors  # 导入颜色规范模块
from mpl_toolkits.mplot3d.art3d import Poly3DCollection  # 导入3D多边形集合,用于填充区域# 数据定义
batch_sizes = [5, 10, 15, 20, 25]  # 不同的batch size
epochs = [10, 20, 30, 40, 50, 60, 70, 80]  # 不同的epoch
# 需要展示变化的Epoch
show_epochs = [20, 50, 80]  # 特定的epoch用于重点展示
accuracies = [  # 模拟不同batch size和epoch下的准确率[0.21, 0.22, 0.24, 0.34, 0.44, 0.54, 0.61, 0.75],[0.23, 0.30, 0.38, 0.40, 0.60, 0.72, 0.84, 0.92],[0.14, 0.22, 0.38, 0.44, 0.70, 0.77, 0.85, 0.93],[0.15, 0.25, 0.40, 0.43, 0.65, 0.72, 0.84, 0.93],[0.16, 0.28, 0.38, 0.44, 0.68, 0.77, 0.84, 0.93]
]# 创建网格
X, Y = np.meshgrid(epochs, batch_sizes)  # 创建X-Y网格
Z = np.array(accuracies)  # 将准确率数据转化为numpy数组# 绘制3D图形
fig = plt.figure(figsize=(10, 8))  # 创建一个10x8英寸的图形
ax = fig.add_subplot(111, projection='3d')  # 添加3D坐标轴# 创建颜色映射
norm = mcolors.Normalize(vmin=min(batch_sizes), vmax=max(batch_sizes))  # 归一化batch size,用于颜色映射
cmap = cm.viridis  # 使用viridis颜色映射# 设置统一的线宽
line_width = 1.0  # 统一的线宽设置# 绘制每个batch size的折线
for i, batch_size in enumerate(batch_sizes):  # 循环遍历每个batch size# 绘制批次大小对应的3D曲线ax.plot(epochs, [batch_size]*len(epochs), accuracies[i], label=f'Batch Size {batch_size}', color=cmap(norm(batch_size)), linewidth=line_width)# 画出折线在平面上的投影ax.plot(epochs, [batch_size]*len(epochs), np.zeros(len(epochs)), color=cmap(norm(batch_size)), linewidth=line_width)# 创建用于填充的多边形顶点verts = [(x, batch_size, z) for x, z in zip(epochs, accuracies[i])]  # 曲线上的顶点坐标verts += [(x, batch_size, 0) for x in epochs[::-1]]  # XY平面上的顶点 (Z=0)# 使用 Poly3DCollection 填充曲线与 XY 平面之间的区域poly = Poly3DCollection([verts], color=cmap(norm(batch_size)), alpha=0.3)  # 创建半透明填充区域ax.add_collection3d(poly)  # 将填充区域添加到图形中# 添加颜色条
mappable = cm.ScalarMappable(norm=norm, cmap=cmap)  # 创建颜色映射器
mappable.set_array(batch_sizes)  # 设置颜色映射的数据范围
fig.colorbar(mappable, ax=ax, shrink=0.5, aspect=10)  # 添加颜色条,调整大小和形状# 在特定的epoch上展示点和数值
for epoch in show_epochs:  # 遍历需要重点展示的epochdata_list_x = []  # 存储epoch的数据data_list_y = []  # 存储batch size的数据data_list_z = []  # 存储准确率数据for i, batch_size in enumerate(batch_sizes):  # 遍历每个batch size# 绘制重点的散点图,突出显示ax.scatter(epoch, batch_size, accuracies[i][epochs.index(epoch)], color=cmap(norm(batch_size)), s=20, edgecolor='black', zorder=10)# 在散点旁边显示数值ax.text(epoch, batch_size, accuracies[i][epochs.index(epoch)], f'{accuracies[i][epochs.index(epoch)]:.2f}', color='black', zorder=10)data_list_x.append(epoch)  # 记录当前的epochdata_list_y.append(batch_size)  # 记录当前的batch sizedata_list_z.append(accuracies[i][epochs.index(epoch)])  # 记录当前的准确率# 绘制每个特定epoch下的虚线连接不同batch size的准确率ax.plot(data_list_x, data_list_y, data_list_z, color='black', linewidth=line_width, linestyle='--')# 设置坐标轴标签
ax.set_xlabel('Epochs')  # 设置X轴标签
ax.set_ylabel('Batch Size')  # 设置Y轴标签
ax.set_zlabel('Accuracy', labelpad=-2)  # 设置Z轴标签# 关闭默认的网格
ax.grid(False)  # 关闭网格线# 调整视角
ax.view_init(elev=30, azim=225)  # 设置视角:俯视角30度,方位角225度plt.savefig('3d_plot.png', dpi=300, bbox_inches='tight')  # 保存图形为高分辨率的PNG文件
# 显示图形
plt.show()  # 显示图形


http://www.ppmy.cn/news/1529583.html

相关文章

Linux C高级 day2

一、 1.mkdir ../dir1 && touch ../dir/file 2.cp -r /mnt/dir1/* /home/dir2 3.pwd 4.ls -l 5.ip或ifconfig 6.top 7.ps aux | grep python 8.kill -9 7580 9.ping 10.find /usr -type f -name *name* 11. a-> 输入内容->ese->shift冒号 wq回车 …

大数据系统调优:从DAG到单机

目标:优化T10的时效性全局DAG调度层优化:提前任务开始时间: 1. 优化慢结点:T10依赖了T4,T7,T8, 其中T8为瓶颈,如果T8能提前点完成,T10可以早点开始,就能早点完成 2. 快结点做更多预计算…

QT widgets 窗口缩放,自适应窗口大小进行布局

1. 窗口布局 2. 尺寸策略:扩展 Fixed (固定): 行为:控件的大小是固定的,不会随着窗口大小的变化而改变。它的大小由控件的 sizeHint() 返回的值决定。 适用场景:当你希望控件的大小保持不变,不随布局调整时使用&#x…

LeetCode 滑动窗口 每个字符最多出现两次的最长子字符串

每个字符最多出现两次的最长子字符串 给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该 子字符串 的 最大 长度。 示例 1: 输入: s “bcbbbcba” 输出: 4 解释: 以下子字符串长度…

vue3自定义hooks

引言 Vue3引入了组合式API,使得代码逻辑更自由、灵活。其中自定义Hooks能让我们将客服用的逻辑抽离成一个独立的函数,以实现在多个组件中复用的目的。可以简单理解成封装成一个模块,以方便其他地方调用。 实现 自定义hooks useDog impor…

在petalinux工程里添加iperf

在petalinux工程里添加iperf 1,首先确定iperf包在哪里 xxx/components/yocto/layer/ meta-openembedded/meta-oe/recipes-benchmark/iperf3/ 2,然后就是往menuconfig中加: xxx/project-spec/meta-user/conf/user-rootfsconfig文件中 添加: …

Selenium with Python学习笔记整理(网课+网站持续更新)

本篇是根据学习网站和网课结合自己做的学习笔记,后续会一边学习一边补齐和整理笔记 官方学习网站在这获取: https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自动化环境配置 (推荐靠谱的博客文章来进行环境配置,具…

C++(Qt)软件调试---断点高级用法(20)

C(Qt)软件调试—断点高级用法(20) 文章目录 C(Qt)软件调试---断点高级用法(20)[toc]1、概述2、断点高级用法1.1 条件断点1.2 日志断点/记录点/消息追踪点1.3 函数断点1.4 命中次数断点1.5 异常断点1.6 等待断点/触发断点1.7 临时断…