numpy 图形的等间距标记绘图

fnatzsnv  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(87)

我在信号处理方面遇到了一些问题。我对编程相当陌生,所以我可能完全错了。我在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()


cdmah0mi

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)

yjghlzjz

yjghlzjz2#

x_markers似乎是正确的。interp可能会窒息,因为@jared和我认为你的频率序列是非单调的。提示:执行验证图,其中垂直轴为x_data,水平轴为arange。它应该是一条直线。
查找y_markers的代码似乎是合理的,但您应该添加一个调试断点并检查其值以确保正确,因为似乎只绘制了第一个点。
添加网格的目的是使其与number_of_points对齐,而这还没有完成。为此,您需要set_xticks

相关问题