使用numpy roll处理相位数据绘图时多余水平线的解决咨询
解决相位偏移绘图中多余水平线问题
我从CSV文件读取数据并绘图,目标是对X轴(0-1区间的相位)进行偏移,用numpy roll滚动元素后,红色偏移曲线出现了不必要的水平线,该如何消除?
原代码
import numpy as np import matplotlib.pyplot as plt data = np.genfromtxt('radio.csv', delimiter=',', skip_header=1) rad_ph = data[:, 0] rad_pp = data[:, 1] bin_normalized = rad_ph / max(rad_ph) shift = 0.85 bin_shifted = np.roll(bin_normalized, int(shift / np.diff(bin_normalized)[0])) plt.figure(figsize=(14,8)) ax = plt.subplot() ax.plot(bin_normalized, (rad_pp*50), linestyle='-',color='b', label='Normal', linewidth=2) ax.plot(bin_shifted, (rad_pp*50), linestyle='-',color='#9a2462', label='shifted', linewidth=2) plt.legend(prop={'size': 16}) plt.savefig('PP_overplot_radio.pdf' , dpi=300)
绘图效果

已尝试的方法(均未解决)
- 同时偏移
bin_normalized和rad_pp数组后绘图:
rad_pp_shifted = np.roll(rad_pp, int(shift / np.diff(bin_normalized)[0])) ax.plot(bin_shifted, (rad_pp_shifted*50), linestyle='-', color='#9a2462', label='shifted', linewidth=2, drawstyle='steps-post')
- 用切片替代
np.roll,使用plt.step绘图:
shift = 0.85 shift_idx = int(shift / np.diff(bin_normalized)[0]) bin_shifted = np.concatenate((bin_normalized[shift_idx:], bin_normalized[:shift_idx])) rad_pp_shifted = np.concatenate((rad_pp[shift_idx:], rad_pp[:shift_idx])) plt.figure(figsize=(14,8)) ax = plt.subplot() ax.step(bin_normalized, (rad_pp*50), where='post', linestyle='-', color='b', label='Normal', linewidth=2) ax.step(bin_shifted, (rad_pp_shifted*50), where='post', linestyle='-', color='#9a2462', label='shifted', linewidth=2)
解决方案
问题原因
np.roll会让X轴数组从接近1的数值突然跳回0,plt.plot会直接连接这两个端点,形成横跨X轴的水平线。
修复代码
核心思路是让偏移后的曲线在逻辑上保持连续,再通过X轴范围截断多余部分:
import numpy as np import matplotlib.pyplot as plt data = np.genfromtxt('radio.csv', delimiter=',', skip_header=1) rad_ph = data[:, 0] rad_pp = data[:, 1] bin_normalized = rad_ph / max(rad_ph) shift = 0.85 shift_idx = int(shift / np.diff(bin_normalized)[0]) # 同时偏移X和Y数据 bin_shifted = np.roll(bin_normalized, shift_idx) rad_pp_shifted = np.roll(rad_pp, shift_idx) plt.figure(figsize=(14,8)) ax = plt.subplot() # 绘制原始曲线 ax.plot(bin_normalized, rad_pp*50, linestyle='-', color='b', label='Normal', linewidth=2) # 处理偏移曲线的连续性 # 找到X轴从高到低的分界点 split_idx = np.argmax(np.diff(bin_shifted) < 0) + 1 # 第一部分:从偏移起始到1 x1, y1 = bin_shifted[:split_idx], rad_pp_shifted[:split_idx]*50 # 第二部分:从0到偏移起始,X值+1模拟循环连续 x2, y2 = bin_shifted[split_idx:]+1, rad_pp_shifted[split_idx:]*50 # 绘制连续曲线 ax.plot(np.concatenate([x1, x2]), np.concatenate([y1, y2]), linestyle='-', color='#9a2462', label='shifted', linewidth=2) # 限定X轴范围为0-1,截断多余部分 ax.set_xlim(0, 1) plt.legend(prop={'size': 16}) plt.savefig('PP_overplot_radio.pdf', dpi=300) plt.show()
简化版方法
也可以通过添加循环点实现同样效果:
# 替代上述处理偏移曲线的代码 bin_shifted_full = np.concatenate([bin_shifted, [bin_shifted[0]+1]]) rad_pp_shifted_full = np.concatenate([rad_pp_shifted, [rad_pp_shifted[0]]]) ax.plot(bin_shifted_full, rad_pp_shifted_full*50, linestyle='-', color='#9a2462', label='shifted', linewidth=2) ax.set_xlim(0, 1)
内容的提问来源于stack exchange,提问作者Sara Krauss
相关产品推荐
相关产品推荐

