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