You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Matplotlib绘制PSNR、分辨率、码率对应的3D矩阵数据图

解决方案

你当前使用的plt.plot是Matplotlib的2D折线绘制接口,参数传入错误且未初始化3D坐标系,因此无法生成目标3D图。以下是两种符合需求的实现方式:

方案1:3D散点图(直接展示原始离散样本)

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

# 假设你的数组A已经加载完成,例如从txt读取:a = np.loadtxt("你的数据文件路径.txt")
# *注意三个轴的对应关系,和你要求的完全匹配*
x = a[:, 1]  # 分辨率
y = a[:, 2]  # 码率
z = a[:, 0]  # PSNR

# 初始化3D画布
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(projection="3d")

# 绘制散点,用PSNR值着色更直观
scatter = ax.scatter(x, y, z, c=z, cmap="viridis", s=15)

# 设置坐标轴标签
ax.set_xlabel("分辨率")
ax.set_ylabel("码率")
ax.set_zlabel("PSNR")

# 添加颜色条对应PSNR数值
plt.colorbar(scatter, label="PSNR")

plt.show()

方案2:3D曲面图(展示变化趋势,和目标效果图样式一致)

因为你的原始数据是离散样本,绘制曲面需要先做插值网格化:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from scipy.interpolate import griddata

# 拆分数据
x = a[:, 1]  # 分辨率
y = a[:, 2]  # 码率
z = a[:, 0]  # PSNR

# 生成网格坐标
xi = np.linspace(x.min(), x.max(), 100)
yi = np.linspace(y.min(), y.max(), 100)
xi, yi = np.meshgrid(xi, yi)

# 插值得到网格对应的PSNR值,method可选'linear'/'cubic'/'nearest'
zi = griddata((x, y), z, (xi, yi), method="cubic")

# 绘制曲面
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(projection="3d")
surf = ax.plot_surface(xi, yi, zi, cmap="viridis", edgecolor="none", alpha=0.8)

# 设置坐标轴标签和颜色条
ax.set_xlabel("分辨率")
ax.set_ylabel("码率")
ax.set_zlabel("PSNR")
plt.colorbar(surf, label="PSNR")

plt.show()

注意事项

  • 如果同一个(分辨率,码率)组合对应多个PSNR值,插值前建议先按这两个维度分组取PSNR平均值,避免插值结果异常
  • 可调整cmap参数更换配色(可选'plasma'、'coolwarm'等),调整s参数修改散点大小,调整alpha参数修改曲面透明度

内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 01:06:07