How do I make matplotlib open a box for user comments?

前端 未结 1 1684
别那么骄傲
别那么骄傲 2020-12-02 03:00

I have an interactive plot that listens for certain keypresses and clicks but I want the user to be able to add a comment. I know that artist events don\'t typically allow t

相关标签:
1条回答
  • 2020-12-02 03:15

    Matplotlib will soon has now introduced a TextBox Widget. See it's usage in this example.

    Alternatively, you can use Tkinter's tkSimpleDialog to ask the user for a comment.

    w = tkSimpleDialog.askstring("Title", "Please type comment")
    

    You may then annotate the last picked point with the comment.

    Complete example (which runs in python 2.7):

    import numpy as np
    import matplotlib.pyplot as plt
    import Tkinter, tkSimpleDialog
    
    xy = [(0,0)]
    
    def onpick(event):
        ''' '''
        if event.mouseevent.button == 1: #only want lmb clicks
            selection = event.artist
            xdata = selection.get_xdata()
            ydata = selection.get_ydata()
            ind = event.ind
            point = tuple(zip(xdata[ind], ydata[ind]))
            xclick,yclick = point[0] 
            xy[0] = (xclick,yclick)
            print('[x,y]=',xclick,yclick)   
    
    def on_key(event):
        print('Key press:\'%s\'' %(event.key))
        if event.key == 'c':
            root = Tkinter.Tk()
            root.withdraw()
            w = tkSimpleDialog.askstring("Title", "Please type comment")
            if w != None:
                ax.annotate(w, xy=xy[0], xytext=(20,-20), 
                        arrowprops=dict(facecolor='black', width=2, headwidth=6),
                        textcoords='offset points')
                ax.figure.canvas.draw_idle()
    
    fig = plt.figure(figsize=(8, 6))
    ax = fig.add_subplot(111, facecolor='#FFFFCC')
    
    x, y = 4*(np.random.rand(2, 100) - .5)
    ax.plot(x, y, 'o', picker = 6)
    ax.set_xlim(-2, 2)
    ax.set_ylim(-2, 2)
    
    keyID = fig.canvas.mpl_connect('key_press_event', on_key)
    clickID = fig.canvas.mpl_connect('pick_event', onpick)
    
    plt.show()
    

    0 讨论(0)
提交回复
热议问题