numpy 滚动产生不必要的水平线

jckbn6z7  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(105)

我有下面的python代码,我从一个CSV文件中读取并生成一个图。我的目标是将x轴上的数据移动一些范围,但是x轴是相位(在0 - 1之间)并且在此上下文中移位意味着滚动元素(这就是为什么我用numpy roll)。我的问题是,当我用numpy roll时,它产生了一些不必要的沿着x轴的直线(红色的图)。我怎样才能摆脱这个呢?

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。滚动,然后使用plt。step代替plt。plot绘制移动的数据,但它也不起作用。

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)
ugmeyewa

ugmeyewa1#

这可能是由numpy.roll中使用的边界条件引起的,默认情况下,numpy.roll使用循环边界条件,它可能会导致数组中的最后一个元素被绕到开头,这可能会导致问题。在numpy.roll中使用mode参数。
edit:我修改了我的答案,使用了一种替代方法(数组切片)来移动不依赖于mode参数的数组,或者您可以使用numpy版本1.26.0或更高版本

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])
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.plot(bin_normalized, (rad_pp*50), linestyle='-', color='b', label='Normal', linewidth=2) 
ax.plot(bin_shifted, (rad_pp_shifted*50), linestyle='-', color='#9a2462', label='shifted', linewidth=2)

plt.legend(prop={'size': 16}) 
plt.savefig('PP_overplot_radio.pdf' , dpi=300)

相关问题