Python show image upon hovering over a point

后端 未结 2 1298
名媛妹妹
名媛妹妹 2020-12-13 01:40

I have a 2-d scatter plot of points, that correspond to images. I was wondering if there\'s an easy way to display the corresponding image (as a popup or tooltip) when you h

2条回答
  •  渐次进展
    2020-12-13 02:08

    Find here a complete solution on how to display an image on hover events. It uses a 'motion_notify_event' to detect when the mouse is over a scatter point (hovering). If this is the case, it displays an image annotation with a corresponding image next to the hovered scatter point.

    import matplotlib.pyplot as plt
    from matplotlib.offsetbox import OffsetImage, AnnotationBbox
    import numpy as np; np.random.seed(42)
    
    # Generate data x, y for scatter and an array of images.
    x = np.arange(20)
    y = np.random.rand(len(x))
    arr = np.empty((len(x),10,10))
    for i in range(len(x)):
        f = np.random.rand(5,5)
        arr[i, 0:5,0:5] = f
        arr[i, 5:,0:5] =np.flipud(f)
        arr[i, 5:,5:] =np.fliplr(np.flipud(f))
        arr[i, 0:5:,5:] = np.fliplr(f)
    
    # create figure and plot scatter
    fig = plt.figure()
    ax = fig.add_subplot(111)
    line, = ax.plot(x,y, ls="", marker="o")
    
    # create the annotations box
    im = OffsetImage(arr[0,:,:], zoom=5)
    xybox=(50., 50.)
    ab = AnnotationBbox(im, (0,0), xybox=xybox, xycoords='data',
            boxcoords="offset points",  pad=0.3,  arrowprops=dict(arrowstyle="->"))
    # add it to the axes and make it invisible
    ax.add_artist(ab)
    ab.set_visible(False)
    
    def hover(event):
        # if the mouse is over the scatter points
        if line.contains(event)[0]:
            # find out the index within the array from the event
            ind, = line.contains(event)[1]["ind"]
            # get the figure size
            w,h = fig.get_size_inches()*fig.dpi
            ws = (event.x > w/2.)*-1 + (event.x <= w/2.) 
            hs = (event.y > h/2.)*-1 + (event.y <= h/2.)
            # if event occurs in the top or right quadrant of the figure,
            # change the annotation box position relative to mouse.
            ab.xybox = (xybox[0]*ws, xybox[1]*hs)
            # make annotation box visible
            ab.set_visible(True)
            # place it at the position of the hovered scatter point
            ab.xy =(x[ind], y[ind])
            # set the image corresponding to that point
            im.set_data(arr[ind,:,:])
        else:
            #if the mouse is not over a scatter point
            ab.set_visible(False)
        fig.canvas.draw_idle()
    
    # add callback for mouse moves
    fig.canvas.mpl_connect('motion_notify_event', hover)           
    plt.show()
    

提交回复
热议问题