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

Python matplotlib球面天线辐射图径向颜色缩放问题求助

我明白你想要实现的效果——让3D天线辐射图的颜色沿着径向(从原点到球面的方向)随功率大小渐变,但当前代码里的颜色只随角度(theta/phi)变化,因为每个角度方向只有一个功率值对应的球面点,没有径向的分层。下面是具体的问题分析和解决方案:

问题根源

你的现有代码中,每个(theta, phi)角度只对应一个功率值R,生成的是单层球面表面,颜色仅由该角度的功率决定,自然无法体现径向的颜色渐变。要实现径向颜色缩放,需要在每个角度方向上生成多个径向点(从原点到该角度的最大功率点),让颜色随径向距离(即功率的比例)变化。

解决方案

我们可以通过生成三维网格(theta, phi, 径向比例)来创建多层球面结构,然后让颜色映射到径向比例(或实际功率值),这样就能看到从原点到球面的颜色渐变效果。

修改后的完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

# 读取数据
df = pd.read_csv('EIRP_Data.csv')

# 处理角度和功率数据
theta1d = np.array(df['Theta'])
theta2d = theta1d.reshape([37,73])
phi1d = np.array(df['Phi'])
phi2d = phi1d.reshape([37,73])
power1d = np.array(df['Power'])
power2d = power1d.reshape([37,73])

# 转换为弧度
THETA = np.deg2rad(theta2d)
PHI = np.deg2rad(phi2d)

# 定义径向步数:从0到1,对应从原点到该角度的最大功率点
r_norm = np.linspace(0, 1, 20)  # 20层可以调整,越多渐变越平滑

# 生成三维网格:theta, phi, 径向比例
THETA_3D, PHI_3D, R_NORM_3D = np.meshgrid(THETA, PHI, r_norm, indexing='ij')
# 计算每个点的实际径向距离(功率值)
R_3D = power2d[:, :, np.newaxis] * R_NORM_3D

# 转换为笛卡尔坐标
X = R_3D * np.sin(THETA_3D) * np.cos(PHI_3D)
Y = R_3D * np.sin(THETA_3D) * np.sin(PHI_3D)
Z = R_3D * np.cos(THETA_3D)

# 归一化颜色:用径向比例(0到1)映射到jet色板
norm = plt.Normalize(0, 1)
colors = cm.jet(norm(R_NORM_3D))

# 创建绘图
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')

# 绘制带径向颜色渐变的球面
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors, 
                linewidth=0, antialiased=True, alpha=0.7)

# 设置坐标轴和视角
ax.grid(True)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_xticklabels([])
ax.set_yticklabels([])
ax.set_zticklabels([])
ax.view_init(azim=300, elev=30)

# 添加最大功率的球面网格
phi_grid, theta_grid = np.linspace(0, 2*np.pi, 40), np.linspace(0, np.pi, 40)
PHI_GRID, THETA_GRID = np.meshgrid(phi_grid, theta_grid)
R_MAX = np.max(power2d)
X_GRID = R_MAX * np.sin(THETA_GRID) * np.cos(PHI_GRID)
Y_GRID = R_MAX * np.sin(THETA_GRID) * np.sin(PHI_GRID)
Z_GRID = R_MAX * np.cos(THETA_GRID)
ax.plot_wireframe(X_GRID, Y_GRID, Z_GRID, linewidth=0.5, rstride=20, cstride=20, color='gray')

plt.show()

关键修改点

  • 三维网格生成:用np.meshgrid创建包含theta、phi和径向比例的三维网格,让每个角度方向有多个径向点。
  • 径向颜色映射:使用径向比例R_NORM_3D(0到1)来生成颜色,确保从原点(0)到球面(1)的颜色渐变。
  • 平滑度调整:r_norm = np.linspace(0,1,20)中的20可以调整,数值越大径向渐变越平滑,但绘图速度会变慢。

如果你的需求是让颜色直接对应实际功率值(而非径向比例),只需把颜色生成部分改成:

norm = plt.Normalize(np.min(power2d), np.max(power2d))
colors = cm.jet(norm(R_3D))

这样就能实现你想要的径向颜色缩放效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:24:20