我在信号处理方面遇到了一些问题。我对编程相当陌生,所以我可能完全错了。我在matplotlib中为一个文本框小部件编写了代码。我希望能够在图表上绘制均匀间隔的标记。用户要添加的标记数将输入到文本框中。现在我有一个numpy linspace
函数,它从0开始,到len(x_data)
结束,num
等于我想要添加的标记数。由于某种原因,标记会重叠绘制。因此,它不是在图上绘制10个标记,而是只绘制了5个标记,这些标记绘制在彼此的顶部。我做错什么了吗?
def process_points(event):
ax2.cla()
number_of_points = int(text2_box1.text)
marker_indices = np.linspace(0, len(x_data)-1, number_of_points, dtype=int)
x_markers = x_data[marker_indices]
y_markers = y_data[marker_indices]
ax2.plot(x_data, y_data, color='blue')
ax2.set_xlabel('Frequency (Hz)')
ax2.set_ylabel('Amplitude')
ax2.set_title('Data between lines')
for x, y in zip(x_markers, y_markers):
ax2.plot(x, y, '.', color='crimson')
plt.show()
字符串
我的意思是:
的数据
编辑:更新的代码:
def process_points(event):
ax2.cla()
number_of_points = int(text2_box1.text)
x_markers = np.linspace(0, x_data[-1],number_of_points)
ax2.semilogy(x_data, y_data, color='blue')
ax2.set_xlabel('Frequency (Hz)')
ax2.set_ylabel('Amplitude')
ax2.set_title('Data between lines')
y_markers = np.interp(x_markers, x_data, y_data)
ax2.scatter(x_markers, y_markers, color='crimson')
ax2.grid(True, which='both', axis='both')
plt.show()
型
的
2条答案
按热度按时间cdmah0mi1#
你的数据明显折叠,这意味着一半的数据是重复的,你的第一个点和最后一个点是相同的。您有两种选择:
1.您可以删除重复数据并使用原始方法。数据可能在中间点被折叠了(您必须确认这一点),所以您可以保存
x_data = x_data[:len(x_data)//2]
。y_data
也是如此。然后你应该得到你想要的结果。1.如果你想使用@Reinderien的方法,那么不要执行
x_data[-1]
,它只是返回第一个值(因为折叠),而是执行np.linspace(x_data.min(), x_data.max(), number_of_points)
。yjghlzjz2#
x_markers
似乎是正确的。interp
可能会窒息,因为@jared和我认为你的频率序列是非单调的。提示:执行验证图,其中垂直轴为x_data
,水平轴为arange
。它应该是一条直线。查找
y_markers
的代码似乎是合理的,但您应该添加一个调试断点并检查其值以确保正确,因为似乎只绘制了第一个点。添加网格的目的是使其与
number_of_points
对齐,而这还没有完成。为此,您需要set_xticks
。