Python使用Matplotlib通过鼠标交互实现缩放、移动以及线上点坐标显示功能

这篇具有很好参考价值的文章主要介绍了Python使用Matplotlib通过鼠标交互实现缩放、移动以及线上点坐标显示功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
 
from matplotlib.text import Text, Annotation
from matplotlib.patches import Polygon, Rectangle, Circle, Arrow, ConnectionPatch,Ellipse,FancyBboxPatch
from matplotlib.widgets import Button, Slider, Widget
 

def call_move(event, fig): # event mouse press/release
    global mPress # whether mouse button press or not
    global startx
    global starty
    # print(mPress)
    if event.name=='button_press_event':
        axtemp=event.inaxes 
        # Whether mouse in a coordinate system or not, yes is the figure in the mouse location, no is None
        if axtemp and event.button==1: 
            print(event)
            mPress=True
            startx=event.xdata
            starty=event.ydata
    elif event.name=='button_release_event':
        axtemp=event.inaxes
        if axtemp and event.button==1:
            mPress=False 
    elif event.name=='motion_notify_event':
        axtemp=event.inaxes
        if axtemp and event.button==1 and mPress: # the mouse continuing press
            x_min, x_max = axtemp.get_xlim()
            y_min, y_max = axtemp.get_ylim()
            w=x_max-x_min
            h=y_max-y_min
            # mouse movement
            mx=event.xdata-startx
            my=event.ydata-starty
            axtemp.set(xlim=(x_min-mx, x_min-mx+w))
            axtemp.set(ylim=(y_min-my, y_min-my+h))
            fig.canvas.draw_idle()  # Delay drawing
    return
 
 
def call_scroll(event, fig):
    print(event.name)
    axtemp=event.inaxes
    print('event:',event)
    print(event.xdata,event.ydata)
    # caculate the xlim and ylim after zooming
    if axtemp:
        x_min, x_max = axtemp.get_xlim()
        y_min, y_max = axtemp.get_ylim()
        w = x_max - x_min
        h = y_max - y_min
        curx=event.xdata
        cury=event.ydata
        curXposition=(curx - x_min) / w
        curYposition=(cury - y_min) / h
        # Zoom the figure for 1.1 times
        if event.button == 'down':
            print('befor:',w,h)
            w = w*1.1
            h = h*1.1
            print('down',w,h)
        elif event.button == 'up':
            print('befor:',w,h)
            w = w/1.1
            h = h/1.1
            print('up',w,h)
        print(curXposition,curYposition)
        newx=curx - w*curXposition
        newy=cury - h*curYposition
        axtemp.set(xlim=(newx, newx+w))
        axtemp.set(ylim=(newy, newy+h))
        fig.canvas.draw_idle()  # drawing



def update_annot(ind, l1, annot, x_str, y_str, fig):
    posx = np.array(l1.get_data())[0][ind["ind"][0]] #get the x in the line
    posy = np.array(l1.get_data())[1][ind["ind"][0]] #get the y in the line
    annot.xy = ([posx, posy])
    text = "{}, {}".format(" ".join([x_str[n] for n in ind["ind"]]),
                           " ".join([y_str[n] for n in ind["ind"]]))
    
    annot.set_text(text)
    cmap = plt.cm.RdYlGn
    norm = plt.Normalize(1,4)
    c = np.random.randint(1,5,size=10) # the upper colour
    annot.get_bbox_patch().set_facecolor(cmap(norm(c[ind["ind"][0]])))
    annot.get_bbox_patch().set_alpha(0.4)
    

    
def hover(event, l1, annot, ax, x_str, y_str, fig):

    vis = annot.get_visible()
    if event.inaxes == ax:
        cont, ind = l1.contains(event)
        if cont: # the mouse in the point
            update_annot(ind, l1, annot, x_str, y_str, fig)
            annot.set_visible(True)
        else:
            if vis:
                annot.set_visible(False)
                fig.canvas.draw_idle()




def draw():
    fig = plt.figure()
    ax = fig.add_subplot(111)
     
    x = np.array([2597.0, 2232.0, 2022.0, 1781.0, 1569.0, 1319.0, 1132.0, 946.0, 743.0, 532.0]) #get x
    x_str = np.array(x).astype(str)
    y = np.array([696.9, 623.8, 550.8, 477.7, 404.6, 328.8, 255.7, 182.7, 109.6, 36.5])# get y
    y_str = np.array(y).astype(str)
    
    annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points",
                            bbox=dict(boxstyle="round", fc="w"),
                            arrowprops=dict(arrowstyle="->"))
    plt.ylabel('first')
    l1, = plt.plot(x, y)
    #l2, = plt.plot(x, y2,color='red',linewidth=1.0,linestyle='--',label='square line')
    #plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='upper right')
    plt.legend(handles=[l1], labels=['up'], loc='upper right')
    annot.set_visible(False) # mouse not display the information when not pointing
    plt.grid()
    
    startx=0
    starty=0
    mPress=False
    fig.canvas.mpl_connect('scroll_event', lambda event: call_scroll(event, fig)) # Event mouse wheel
    fig.canvas.mpl_connect('button_press_event', lambda event: call_move(event, fig)) # Event mouse button press
    fig.canvas.mpl_connect('button_release_event', lambda event: call_move(event, fig)) # Event mouse button release
    # fig.canvas.mpl_connect('draw_event', call_move) # Event draw figure
    fig.canvas.mpl_connect('motion_notify_event', lambda event: call_move(event, fig)) # Event mouse move
    fig.canvas.mpl_connect("motion_notify_event", lambda event: hover(event, l1, annot, ax, x_str, y_str, fig))
    x_min = min(x)
    x_max = max(x)
    y_min = min(y)
    y_max = max(y)
    
    ax.set_xlim(x_min, x_max) # xlabel start limition
    ax.set_ylim(y_min, y_max) # ylabel start limition
    
    plt.show()



draw()

参考文章:

缩放:python 桌面软件开发-matplotlib画图鼠标缩放拖动_matplotlib缩放-CSDN博客

获取点坐标参考的文章忘了,侵权即删

matplotlib缩放交互,python,matplotlib,交互matplotlib缩放交互,python,matplotlib,交互文章来源地址https://www.toymoban.com/news/detail-849474.html

到了这里,关于Python使用Matplotlib通过鼠标交互实现缩放、移动以及线上点坐标显示功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包