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

基于三列CSV文件用Python-Matplotlib绘制半圆极坐标热力图

解决Matplotlib半圆极坐标热力图的TypeError问题

错误原因

你遇到的TypeError: Input z must be 2D, not 1D是因为Matplotlib的热力图函数(如pcolormesh、contourf)要求输入的数值矩阵z是二维的,对应每个(角度,温度)网格单元的统计值,但你的原始CSV数据是一维的散点记录,直接传入会报错。解决核心是将一维散点数据转换为二维网格数据。

完整解决方案代码

以下是基于Pandas、NumPy和Matplotlib的实现步骤,适配你的数据需求:

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

# 1. 读取CSV数据
df = pd.read_csv('your_data.csv')  # 替换为你的CSV文件路径

# 2. 提取核心数据列
phi_deg = df['phiangle'].values  # 原始角度(0-180°)
temp = df['Temperature'].values  # 温度(25-249)
counts = df['Counts'].values     # 频次值

# 3. 转换角度为弧度(Matplotlib极坐标默认用弧度)
phi_rad = np.deg2rad(phi_deg)

# 4. 创建网格分箱
# 角度分箱:0-π弧度,分成36个区间(每5°一个)
phi_bins = np.linspace(0, np.pi, 37)
# 温度分箱:25-249,步长1,共224个区间
temp_bins = np.linspace(25, 249, 225)

# 5. 将一维数据聚合为二维网格(按网格单元求和Counts)
# z的形状为(温度区间数, 角度区间数),后续需要转置匹配极坐标网格
z, temp_edges, phi_edges = np.histogram2d(temp, phi_rad, bins=[temp_bins, phi_bins], weights=counts)

# 6. 创建网格中点坐标(用于绘图)
r_mid, theta_mid = np.meshgrid(
    temp_bins[:-1] + np.diff(temp_bins)/2,  # 温度区间中点(径向坐标)
    phi_bins[:-1] + np.diff(phi_bins)/2     # 角度区间中点(极角坐标)
)

# 7. 绘制半圆极坐标热力图
fig, ax = plt.subplots(subplot_kw={'projection': 'polar'}, figsize=(8, 6))

# 设置为半圆显示(极角范围0-180°)
ax.set_thetamin(0)
ax.set_thetamax(180)

# 绘制热力图,注意z需要转置以匹配theta_mid和r_mid的形状
pcm = ax.pcolormesh(theta_mid, r_mid, z.T, cmap='viridis')

# 配置径向轴(温度)
ax.set_rmin(25)
ax.set_rmax(249)
ax.set_ylabel('Temperature', labelpad=25)
ax.set_yticks(np.arange(50, 250, 50))  # 设置间隔50的温度刻度

# 配置角度轴
ax.set_xticks(np.linspace(0, np.pi, 5))
ax.set_xticklabels(['0°', '45°', '90°', '135°', '180°'])

# 添加颜色条
fig.colorbar(pcm, ax=ax, label='Counts', pad=0.1)

plt.title('Temperature vs Phi Angle Semicircular Heatmap', y=1.1)
plt.show()

关键细节说明

  • 数据聚合:使用np.histogram2d将每个(温度,角度)网格内的Counts求和,得到二维的z矩阵,解决了1D输入的问题。如果需要其他聚合方式(如均值),可以改用Pandas的pivot_table:
    # 分箱分组
    df['phi_bin'] = pd.cut(df['phiangle'], bins=np.arange(0, 181, 5))
    df['temp_bin'] = pd.cut(df['Temperature'], bins=np.arange(25, 250, 1))
    # 聚合求和
    pivot_df = df.pivot_table(values='Counts', index='temp_bin', columns='phi_bin', aggfunc='sum', fill_value=0)
    # 转换为绘图用的网格数据
    r_mid = pivot_df.index.map(lambda x: x.mid).values
    theta_mid = np.deg2rad(pivot_df.columns.map(lambda x: x.mid).values)
    r, theta = np.meshgrid(r_mid, theta_mid)
    z = pivot_df.values.T
    
  • 半圆设置:通过ax.set_thetamin(0)和ax.set_thetamax(180)限制极角范围,实现半圆显示。
  • 坐标匹配:np.meshgrid生成的极角(theta_mid)和径向(r_mid)网格是二维的,需要将聚合后的z矩阵转置(z.T)才能匹配维度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:05:35