在局部放电的PRPD图谱是诊断设备绝缘状态的核心密码。很多人对其认知停留在不同缺陷对应不同形状图谱的表层阶段,却忽略了其本质是矩阵数据的可视化呈现。脱离数据本质谈图谱形状,如同盲人摸象,难以精准定位缺陷类型与严重程度。本文将从PRPD图谱的本质原理入手,拆解矩阵数据的核心逻辑,再通过Python实操案例,手把手教你绘制PRPD图、幅度-相位棒图及PRPS图。
一、PRPD图谱的本质是矩阵数据
PRPD图谱虽然以二维平面展示,但其实它包含了相位、幅度和放电次数三维信息,通过它们之间的关联,反映局部放电的发生规律。但多数人观察图谱时,仅关注放电点的分布形态,却忽略了:所有形态特征,本质都是矩阵数据的直观体现。PRPD图谱的底层数据是一个二维矩阵,其维度定义与数据映射规则如下:- 矩阵维度:通常为M×N矩阵,其中M对应“相位区间数”,N对应“幅度区间数”。例如,将一个50Hz工频周期(360°)划分为60个相位区间,将放电幅度划分为256个等级,则PRPD数据矩阵为60×256。
- 矩阵元素值:矩阵中每个元素(i,j)代表“第i个相位区间内,放电幅度落在第j个等级的放电次数”。元素值越大,说明该相位-幅度组合下的放电越频繁,在图谱中表现为对应位置的像素点越亮(或颜色越深)。简单来说,PRPD图谱就是将“相位-幅度-次数”三维数据,通过“相位为横轴、幅度为纵轴、次数为颜色强度”的方式可视化,矩阵数据的分布直接决定了图谱的形状。
脱离矩阵数据分析图谱形状,无法区分相似形状背后的不同缺陷—— 即使两类缺陷的 PRPD 图谱均呈现簇状视觉特征,其底层矩阵数据的分布规律仍存在本质差异,对应着完全不同的缺陷类型与放电特性:- 悬浮电位体放电:矩阵中高值元素(放电次数多的区间)呈簇状分布,高度集中在少数相位区间,且同一相位区间内的高值元素仅分布在窄幅的幅度等级范围内(即幅度标准差较小)。这是因为悬浮电位体放电脉冲幅值稳定,相邻放电时间间隔基本一致,反映为矩阵中幅度等级高度收敛。
- 绝缘件内部气隙放电:矩阵中高值元素虽呈簇状分布,相位区间相对固定,但覆盖的幅度等级范围广(即幅度标准差大、幅值离散),且整体矩阵元素的非零值数量少、跨周期的数值重复性低。这是因为气隙放电本身次数少、周期重复性低,反映为矩阵中非零元素总量少;放电幅值分散则体现为同一相位区间内的高值元素跨多个幅度等级分布;而相位较稳定、无明显极性效应的特点,会表现为矩阵中正负半波对应相位区间的元素值分布规律一致。
可见,PRPD 图谱的簇状仅是视觉表象,只有结合矩阵数据的数值分布范围、集中趋势、离散程度,以及正负半波极性特征、周期重复性,才能精准区分悬浮电位体放电、绝缘件内部气隙放电等缺陷类型,解读图谱背后的真实绝缘状态。二、局部放电三类核心图谱的逻辑关联
除了经典PRPD图,局部放电检测中还常用幅度-相位棒图、PRPS图,三者均基于同一套原始放电数据,仅可视化维度与侧重点不同,核心逻辑均围绕矩阵数据展开。2.1 经典PRPD图:次数维度的统计可视化
如前文所述,PRPD图以相位(横轴)、幅度(纵轴)为坐标,以放电次数(颜色/亮度)为第三维度,本质是对原始放电数据的“相位-幅度”二维区间统计,矩阵元素值直接对应颜色强度。2.2 幅度-相位棒图:相位区间最大幅度的全局呈现
幅度-相位棒图聚焦“相位-最大幅度”关联,不统计放电次数,而是按相位区间划分,计算每个区间内的最大放电幅度,以棒图形式展示。其核心价值是全局呈现360°相位内放电强度的峰值分布,直观定位放电强度最高的相位区间。2.3 PRPS 时序图:时间-相位-幅度的三维动态呈现
PRPS 图在相位(横轴)、幅度(纵轴)基础上,增加时间维度,以工频周期为单位,沿Z轴展开,本质是“周期-相位-最大幅度”三维数据的立体可视化。通过高度(幅度)、位置(周期-相位),可直观观察不同周期内放电强度与相位分布的变化。2.4 三种图谱的核心关联
三类图谱的原始数据均来自局部放电检测仪采集的“单次放电事件记录”,每条记录包含三个核心参数:放电发生时的工频相位φ、放电幅度q、放电发生时间t(周期)。通过对这三组参数的不同维度组合与处理,即可生成三类图谱:- PRPD图:对(φ,q)进行区间划分,统计每个区间的放电次数,生成次数矩阵并可视化;
- 幅度-相位棒图:对φ划分区间,计算每个区间的q最大值,以棒图呈现相位-最大幅度关联;
- PRPS图:以周期为Z轴维度,对每个周期内的(φ,q)划分区间并取q最大值,生成三维数据并以棒图立体展示。
三、Python实操:手把手绘制三类图谱
下面将基于Python实现三类图谱的绘制,核心用到numpy、matplotlib、tkinter库。首先模拟一组符合悬浮放电特征的原始数据,再实现三类图谱绘制与界面整合,形成可交互的可视化工具。3.1 环境准备与数据模拟、预处理
pip install numpy matplotlib tkinter
模拟生成局部放电原始数据并预处理:假设采集1000次放电事件,数据符合悬浮放电特征(相位集中在90°和270°附近,幅度集中在500pC左右),同时过滤无效数据、剔除重复值,确保数据可靠性。N_DISCHARGES = 1000 # 总放电次数PHASE_MEAN1 = 90 # 第一簇相位均值(°)PHASE_MEAN2 = 270 # 第二簇相位均值(°)PHASE_STD = 15 # 相位标准差AMPLITUDE_MEAN = 500 # 幅度均值(pC)AMPLITUDE_STD = 3 # 幅度标准差TIME_RANGE = (0, 50) # 周期范围AMPLITUDE_LOWER = 0 # 幅度下限AMPLITUDE_UPPER = 1000 # 幅度上限N_PHI_BINS = 60 # 相位区间数N_Q_BINS = 256 # PRPD幅度区间数PRPS_CYCLES = 50 # PRPS展示周期数# 数据生成:def generate_simulation_data() -> Tuple[np.ndarray, np.ndarray, np.ndarray]: np.random.seed(42) # 固定随机种子 # 相位数据 phi = np.concatenate([ np.random.normal(PHASE_MEAN1, PHASE_STD, N_DISCHARGES//2), np.random.normal(PHASE_MEAN2, PHASE_STD, N_DISCHARGES - N_DISCHARGES//2) ]) # 幅度数据:正态分布 q = np.random.normal(AMPLITUDE_MEAN, AMPLITUDE_STD, N_DISCHARGES) # 时间数据:随机分布 t = np.random.randint(TIME_RANGE[0], TIME_RANGE[1]+1, N_DISCHARGES) return phi, q, t# 数据预处理:过滤异常值、剔除重复值def preprocess_data(phi: np.ndarray, q: np.ndarray, t: np.ndarray) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: # 过滤异常值(幅度0-60pC,相位0-360°) mask = ( (q >= AMPLITUDE_LOWER) & (q <= AMPLITUDE_UPPER) & (phi >= 0) & (phi <= 360) ) phi_filtered = phi[mask] q_filtered = q[mask] t_filtered = t[mask] combined = np.vstack([phi_filtered, q_filtered, t_filtered]).T combined_unique = np.unique(combined, axis=0) return combined_unique[:, 0], combined_unique[:, 1], combined_unique[:, 2]# 生成并预处理数据phi_raw, q_raw, t_raw = generate_simulation_data()phi_clean, q_clean, t_clean = preprocess_data(phi_raw, q_raw, t_raw)print(f"数据预处理完成:有效放电事件 {len(phi_clean)} 条")
3.2 绘制经典PRPD图(相位-幅度-次数热力图)PRPD图的绘制核心是构建“相位-幅度”统计矩阵,通过热力图将放电次数映射为颜色,清晰呈现放电的统计分布规律。def plot_prpd(phi: np.ndarray, q: np.ndarray) -> plt.Figure: """绘制PRPD图谱""" fig, ax = plt.subplots(figsize=(8, 6)) # 划分相位、幅度区间 phi_bins = np.linspace(0, 360, N_PHI_BINS + 1) q_bins = np.linspace(AMPLITUDE_LOWER, AMPLITUDE_UPPER, N_Q_BINS + 1) # 构建PRPD统计矩阵 prpd_matrix, _, _ = np.histogram2d(phi, q, bins=[phi_bins, q_bins]) # 绘制热力图 im = ax.imshow( prpd_matrix.T, origin='lower', extent=[0, 360, AMPLITUDE_LOWER, AMPLITUDE_UPPER], cmap='jet', aspect='auto' ) # 坐标轴与标注设置 ax.set_xlabel('相位(°)', fontsize=10) ax.set_ylabel('放电幅度(pC)', fontsize=10) ax.set_title('PRPD图谱', fontsize=12, fontweight='bold') # 添加颜色条 cbar = plt.colorbar(im, ax=ax) cbar.set_label('放电次数', fontsize=8) ax.grid(False) return fig
结果说明:绘制的PRPD图中,红色区域对应放电次数最密集的相位-幅度区间,可清晰看到90°和270°附近的双簇高亮度区域,符合悬浮放电特征。调整N_PHI_BINS可改变图谱分辨率,区间数越多,细节越丰富,但计算量略有增加。3.3 绘制幅度-相位棒图(各相位区间最大幅度)
幅度-相位棒图聚焦每个相位区间的最大放电幅度,以棒图形式展示,直观呈现360°相位内放电强度的峰值分布,突出核心放电相位区。def plot_amplitude_phase_bar(phi: np.ndarray, q: np.ndarray) -> plt.Figure: """绘制幅度-相位棒图""" fig, ax = plt.subplots(figsize=(8, 6)) # 划分相位区间(与PRPD图一致) phi_bins = np.linspace(0, 360, N_PHI_BINS + 1) phi_bin_centers = (phi_bins[:-1] + phi_bins[1:]) / 2 # 计算每个相位区间的最大幅度 max_amplitude = np.zeros(N_PHI_BINS) for i in range(N_PHI_BINS): mask_bin = (phi >= phi_bins[i]) & (phi < phi_bins[i+1]) if np.any(mask_bin): max_amplitude[i] = np.max(q[mask_bin]) else: max_amplitude[i] = 0 # 绘制棒图 ax.bar(phi_bin_centers, max_amplitude, width=1, color='#FF0000', alpha=0.8) # 坐标轴设置 ax.set_xlabel('相位(°)', fontsize=10) ax.set_ylabel('最大放电幅度(pC)', fontsize=10) ax.set_title('幅度-相位棒图', fontsize=12, fontweight='bold') ax.set_xlim(0, 360) ax.set_ylim(0, AMPLITUDE_UPPER + 50) ax.xaxis.set_major_locator(MultipleLocator(90)) # 相位每90°标注 ax.grid(axis='y', alpha=0.3) return fig
结果说明:图中红色棒的高度代表对应相位区间的最大放电幅度,可直观看到90°和270°附近的棒体最高,与悬浮放电的相位集中特征一致。调整ax.bar的width参数可改变棒体宽度,适配不同相位区间数。3.4 绘制PRPS图(周期-相位-幅度立体图)
PRPS 图将50个周期的“相位-最大幅度”数据沿周期轴展开,以锥形(锥形更美观)形式立体呈现,每个锥形对应一个周期-相位区间的最大幅度,直观反映时间维度的放电变化。def plot_prps_3d(phi: np.ndarray, q: np.ndarray, t: np.ndarray) -> plt.Figure: """绘制PRPS 3D图""" fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # 划分相位区间(与前两类图一致) phi_bins = np.linspace(0, 360, N_PHI_BINS + 1) phi_bin_centers = (phi_bins[:-1] + phi_bins[1:]) / 2 # 统计每个周期-相位区间的最大幅度 cycle_phase_amp = np.zeros((PRPS_CYCLES, N_PHI_BINS)) for cycle_idx in range(PRPS_CYCLES): mask_cycle = t == cycle_idx # 筛选当前周期数据 if not np.any(mask_cycle): continue phi_cycle = phi[mask_cycle] q_cycle = q[mask_cycle] # 计算当前周期各相位区间最大幅度 for phase_idx in range(N_PHI_BINS): mask_phase = (phi_cycle >= phi_bins[phase_idx]) & (phi_cycle < phi_bins[phase_idx+1]) if np.any(mask_phase): cycle_phase_amp[cycle_idx, phase_idx] = np.max(q_cycle[mask_phase]) # 生成网格坐标 cycle_x, phase_y = np.meshgrid(np.arange(1, PRPS_CYCLES+1), phi_bin_centers) cycle_x = cycle_x.flatten() phase_y = phase_y.flatten() amp_z = cycle_phase_amp.T.flatten() valid_mask = amp_z > 0 cycle_x, phase_y, amp_z = cycle_x[valid_mask], phase_y[valid_mask], amp_z[valid_mask] # 逐一生成3D锥形 for x, y, z in zip(cycle_x, phase_y, amp_z): x1, x2 = x - 0.05, x + 0.05 y1, y2 = y - 0.12, y + 0.12 z_base = 0 x_top = (x1 + x2) / 2 y_top = (y1 + y2) / 2 z_top = z vertices = np.array([[x1,y1,z_base], [x2,y1,z_base], [x2,y2,z_base], [x1,y2,z_base], [x_top,y_top,z_top]]) faces = [[0,1,4], [1,2,4], [2,3,4], [3,0,4]] for face in faces: ax.plot_trisurf( vertices[face, 0], vertices[face, 1], vertices[face, 2], color='#FF0000', alpha=0.8, shade=True ) # 坐标轴设置 ax.set_xlabel('周期', fontsize=10) ax.set_ylabel('相位/°', fontsize=10) ax.set_zlabel('最大放电幅度(pC)', fontsize=10) ax.yaxis.set_major_locator(MultipleLocator(90)) # 相位每90°标注 ax.set_ylim(0, 360) ax.set_zlim(0, AMPLITUDE_UPPER + 50) ax.set_title('PRPS图谱', fontsize=12, fontweight='bold') return fig
结果说明:PRPS图中,x轴为周期(1-50),y轴为相位(0-360°),z轴为最大幅度,每个红色锥形代表对应周期-相位区间的放电峰值。若各周期锥形分布形态一致,说明放电稳定;若某周期锥形数量增多、高度增加,可能提示缺陷恶化。四、总结
PRPD图谱的本质是矩阵数据的可视化,脱离数据谈形状,难免陷入解读误区。本文从矩阵数据核心出发,拆解了PRPD图、幅度-相位棒图、PRPS 3D锥形图的逻辑关联,并通过Python实操实现了三类图谱的绘制与界面整合。三类图谱基于同一套原始数据,分别从统计规律,全局峰值,时间动态三个维度呈现放电特征,形成互补的缺陷诊断依据。局部放电图谱模拟小程序已升级,支持自定义图谱,长按扫描体验。