Python绘制3D图遇维度不匹配问题,请求技术帮助
解决3D绘图维度不匹配问题
你的核心问题是3D绘图要求X、Y、Z三个数组维度完全一致,但当前d和f_sample是一维数组(长度4),FSPL_remotes是一维数组(长度16),无法直接用于绘图。需要将前两者转换为二维网格数组,同时把FSPL_remotes也调整为对应维度的二维数组。
以下提供两种可行方案:
方案1:用NumPy向量化运算(推荐)
借助NumPy的网格生成和向量化计算,高效完成维度匹配并绘图:
import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt # 转换为NumPy数组,方便后续操作 d = np.array([23.1476, 125.4207, 146.0814, 129.8549]) f_sample = np.array([902, 904, 906, 908]) # 生成二维网格:X对应每个d值重复4次,Y对应每个频率值重复4次 X, Y = np.meshgrid(d, f_sample) # 向量化计算FSPL,自动生成4x4的二维数组 FSPL_remotes = 32.44 + 20 * np.log10(X) + 20 * np.log10(Y) # 创建3D绘图 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制曲面图(也可用ax.scatter绘制散点) ax.plot_surface(X, Y, FSPL_remotes, cmap='viridis') # 设置坐标轴标签 ax.set_xlabel('Distance (d)') ax.set_ylabel('Frequency (f_sample)') ax.set_zlabel('FSPL') plt.show()
方案2:手动调整列表维度
如果不想用NumPy,可修改原循环生成二维列表,并手动构建X、Y的网格:
import math from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt d = [23.1476,125.4207,146.0814,129.8549] f_sample = [902,904,906,908] FSPL_remotes = [] # 循环生成4x4的二维FSPL数组 for dist in d: row = [] for freq in f_sample: fspl = 32.44 + 20*math.log10(dist) + 20*math.log10(freq) row.append(fspl) FSPL_remotes.append(row) # 手动构建X、Y的二维网格 X = [[dist for _ in f_sample] for dist in d] Y = [[freq for freq in f_sample] for _ in d] # 创建3D绘图 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.plot_surface(X, Y, FSPL_remotes, cmap='viridis') ax.set_xlabel('Distance (d)') ax.set_ylabel('Frequency (f_sample)') ax.set_zlabel('FSPL') plt.show()
两种方案都能让X、Y、Z保持4x4的维度匹配,顺利完成3D绘图。
内容的提问来源于stack exchange,提问作者Ketan Shende
相关产品推荐
相关产品推荐

