python点击显示图片的程序,将鼠标悬停在一个点上时,Python显示图像

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 hover your mouse over each point? I tried plotly but found out you need to manually edit javascript to get the hover event to work. Is there a simple solution just with matplotlib or some other common package?

解决方案

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()

0102b27354536941ed34c5cea4d19fad.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值