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

使用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)

绘图效果

绘图效果

已尝试的方法(均未解决)

  1. 同时偏移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')
  1. 用切片替代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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:17:52