Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在matplotlib中以交互方式添加和删除散布点_Python_Animation_Matplotlib_Event Handling_Python Interactive - Fatal编程技术网

Python 在matplotlib中以交互方式添加和删除散布点

Python 在matplotlib中以交互方式添加和删除散布点,python,animation,matplotlib,event-handling,python-interactive,Python,Animation,Matplotlib,Event Handling,Python Interactive,以下是我想解决的问题: 我希望能够通过点击绘图以交互方式(I)删除散点(灰点),(ii)添加新的散点 import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(figsize=(16,4)) a = np.sin(range(100))*np.random.normal(20,10,100) b = [ 5, 15, 25, 30, 40, 50, 75, 85] aa = plt.plot(range

以下是我想解决的问题: 我希望能够通过点击绘图以交互方式(I)删除散点(灰点),(ii)添加新的散点

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(16,4))
a = np.sin(range(100))*np.random.normal(20,10,100)
b = [ 5, 15, 25, 30, 40, 50, 75, 85]

aa = plt.plot(range(len(a)),a,color='red')
bb = plt.scatter(b,a[b],color='grey',s=50)

这可能并不优雅,但它确实有效。单击鼠标左键添加点,单击鼠标右键删除点

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(figsize=(16,4))
a_input = np.sin(range(100))*np.random.normal(20,10,100)
b_input = [ 5, 15, 25, 30, 40, 50, 75, 85]

a = plt.plot(range(len(a_input)),a_input,color='red')[0]
b = plt.scatter(b_input,a_input[b_input],color='grey',s=50,picker=5)

def add_or_remove_point(event):
    global a
    xydata_a = np.stack(a.get_data(),axis=1)
    xdata_a = a.get_xdata()
    ydata_a = a.get_ydata()
    global b
    xydata_b = b.get_offsets()
    xdata_b = b.get_offsets()[:,0]
    ydata_b = b.get_offsets()[:,1]

    #click x-value
    xdata_click = event.xdata
    #index of nearest x-value in a
    xdata_nearest_index_a = (np.abs(xdata_a-xdata_click)).argmin()
    #new scatter point x-value
    new_xdata_point_b = xdata_a[xdata_nearest_index_a]
    #new scatter point [x-value, y-value]
    new_xydata_point_b = xydata_a[new_xdata_point_b,:]

    if event.button == 1:
        if new_xdata_point_b not in xdata_b:

            #insert new scatter point into b
            new_xydata_b = np.insert(xydata_b,0,new_xydata_point_b,axis=0)
            #sort b based on x-axis values
            new_xydata_b = new_xydata_b[np.argsort(new_xydata_b[:,0])]
            #update b
            b.set_offsets(new_xydata_b)
            plt.draw()
    elif event.button == 3:
        if new_xdata_point_b in xdata_b:
            #remove xdata point b
            new_xydata_b = np.delete(xydata_b,np.where(xdata_b==new_xdata_point_b),axis=0)
            print(new_xdata_point_b)
            #update b
            b.set_offsets(new_xydata_b)
        plt.draw()

fig.canvas.mpl_connect('button_press_event',add_or_remove_point)

由于这不是一个代码编写服务,您可以从查看页面开始。我认为我的问题与stackoverflow上的大多数问题没有什么不同。我觉得你有点苛刻。我一直在阅读事件处理页面,但希望其他用户能给我一些指导。@themachinist-我很感激您至少对事件处理做了一些研究,但您肯定可以在这之后尝试编写一些代码,不管代码有多糟糕。然后,你可以准确地描述它没有做你想做的事情(或者它正在做你不想做的事情;-),并且你不会受到一大堆意见的影响。谢谢你的建议。我的拙见是,只要一个Q是明确的,它就为其他人增加了价值,无论是否显示出解决它的失败尝试,例如。如果我的问题不清楚,那么这是我的错,我同意有时包括尝试解决它可以帮助Clary解决这个问题。为了记录在案,我决定从现在开始展示我失败的尝试,以此来避免任何不愉快的感觉。干得好!因此,如果你想找到更好的方法,请接受你自己的答案,然后发布一个新问题,询问如何改进你编写的代码(工作正常,又做得很好!)。太好了,@themmachnist!正是我想要的。非常感谢。