基于三列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
相关产品推荐
相关产品推荐

