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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 23:05:27