如何使用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
相关产品推荐
相关产品推荐

