鼠标控制matplot绘制的点运动

以下是matplotlib中注册鼠标按键事件的方法:具体来说可以注册一些鼠标按下、滑动等事件 import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fitx_lim_all = (-6, 6)
y_lim_all = (-5, 35)#这两个千万不要放到test6()这个函数里面 否则就失效了
globalx = 0
globaly = 0
global_ind = []
def only_test():"""已经实现了从鼠标点 然后正弦曲线下移的动态操作"""# 先生成一群点,把点画出来fig, ax = plt.subplots()x = np.array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]).astype(np.float64)  # 点的横坐标,放在一个数组里面y = np.square(x).astype(np.float64)  # y=x^2,根据x生成y的坐标,我这里用的二次曲线方程plt.xlim(-6, 6)  # 坐标系x轴范围plt.ylim(-5, 35)  # 坐标系y轴范围ax.scatter(x, y)  # 画成散点图ax.plot(x, y)  # 画成散点图# 忽略除以0的报错np.seterr(divide='ignore', invalid='ignore')# print("点击鼠标左键    当前的x_lim_all:\t",x_lim_all,"\t\t当前的y_lim_all:\t",y_lim_all)# 二阶曲线方程def func_2(x, a, b, c):return a * np.power(x, 2) + b * x + c# 鼠标点击事件  函数里面又绑定了一个鼠标移动事件,所以生成的效果是鼠标按下并且移动的时候def on_button_press(event):if event.button==1:print("点击鼠标左键    当前的x_lim_all:\t",x_lim_all,"\t\t当前的y_lim_all:\t",y_lim_all)# global globalx# global globalyglobalx = event.xdataglobaly = event.ydataglobal global_indglobal_ind = []  # 这里生成一个列表存储一下要移动的那个点# 计算一下鼠标的位置和图上点的位置距离,如果距离很近就移动图上那个点for i in range(len(x)):# 计算一下距离 图上每个点都和鼠标计算一下距离d = np.sqrt((globalx - x[i]) ** 2 + (globaly - y[i]) ** 2)if d < 0.4:  # 这里设置一个阈值,如果距离很近,就把它添加到那个列表中去global_ind.append(i)global_ind = global_ind.sort()print(global_ind)fig.canvas.mpl_connect('motion_notify_event', on_button_move)# on_button_move 鼠标移动事件def on_button_move(event, y=y):current_ax = event.inaxesif event.button == 1:  # 1、2、3分别代表鼠标的左键、中键、右键,我这里用的是鼠标中键,根据自己的喜好选择吧global global_indx_mouse, y_mouse = event.xdata, event.ydata  # 拿到鼠标当前的横纵坐标# ind = []  # 这里生成一个列表存储一下要移动的那个点# # 计算一下鼠标的位置和图上点的位置距离,如果距离很近就移动图上那个点# for i in range(len(x)):#     # 计算一下距离 图上每个点都和鼠标计算一下距离#     d = np.sqrt((x_mouse - x[i]) ** 2 + (y_mouse - y[i]) ** 2)#     if d < 0.8:  # 这里设置一个阈值,如果距离很近,就把它添加到那个列表中去#         ind.append(i)# print(ind)if global_ind:  # 如果ind里面有元素,说明当前鼠标的位置距离图上的一个点很近# 通过索引ind[0]去改变当前这个点的坐标,新坐标是当前鼠标的横纵坐标(这样给人的感觉就是这个点跟着鼠标动了)y[global_ind[-1]] = y_mousex[global_ind[-1]] = x_mouse# 然后根据所有点拟合出来一个二次方程曲线popt2, pcov2 = curve_fit(func_2, x, y)a2 = popt2[0]b2 = popt2[1]c2 = popt2[2]yvals2 = func_2(x, a2, b2, c2)# 拟合好了以后把曲线画出来ax.cla()print("中键   当前的x_lim_all:\t", x_lim_all, "\t\t当前的y_lim_all:\t", y_lim_all)current_ax.set(xlim=x_lim_all,ylim=y_lim_all)ax.scatter(x, y)ax.plot(x, yvals2)fig.canvas.draw_idle()  # 重新绘制整个图表,所以看到的就是鼠标移动点然后曲线也跟着在变动def on_button_release(event):fig.canvas.mpl_disconnect(fig.canvas.mpl_connect('motion_notify_event', on_button_move))  # 鼠标释放事件def enlarge(event):global x_lim_allglobal y_lim_allx, y = event.xdata, event.ydata #这个暂时没有用上current_ax=event.inaxesxmin, xmax = current_ax.get_xlim()ymin, ymax = current_ax.get_ylim()x_step1,x_step2=(x-xmin)/10,(xmax-x)/10y_step1,y_step2=(y-ymin)/10,(ymax-y)/10if event.button=="up":##鼠标向上滚动,缩小坐标轴刻度范围,使得图形变大x_lim_all=(xmin+x_step1,xmax-x_step2)y_lim_all=(ymin + y_step1, ymax - y_step2)current_ax.set(xlim=x_lim_all,ylim=y_lim_all)if event.button=="down":##鼠标向下滚动,增加坐标轴刻度范围,使得图形变小x_lim_all=(xmin-x_step1,xmax+x_step2)y_lim_all=(ymin-y_step1, ymax+y_step2)current_ax.set(xlim=x_lim_all,ylim=y_lim_all)fig.canvas.draw_idle()fig.canvas.mpl_disconnect(fig.canvas.manager.key_press_handler_id)  # 取消默认快捷键的注册fig.canvas.mpl_connect('button_press_event', on_button_press)#鼠标点击事件fig.canvas.mpl_connect('button_release_event', on_button_release)#鼠标松开fig.canvas.mpl_connect('scroll_event', enlarge)#鼠标滚轮滚动事件plt.show()if __name__ == '__main__':only_test()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/6068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python try/except/finally

稍微总结一下&#xff0c;否则总是忘。 x abc def fetcher(obj, index): return obj[index] fetcher(x, 4) 输出&#xff1a; File "test.py", line 6, in <module> fetcher(x, 4) File "test.py", line 4, in fetcher return obj[index] …

zookeeper的应用

Zookeeper的配置文件解析: Zookeeper内部原理: 选举机制 半数机制:在集群环境中半数以上的机器存活,这个集群可用,所以在设计Zookeeper集群系统时&#xff0c;通常会选择 奇数台服务器来搭建Zookeeper的集群 虽然在配置文件中并没有指定Master和Slave。但是&#xff0c;Zookeep…

第三十二章:MySQL事务日志

第三十二章&#xff1a;MySQL事务日志 32.1&#xff1a;概述 事物有4种特性&#xff1a;原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢&#xff1f; 事物的隔离性有锁机制实现。而事物的原子性、一致性和持久性由事物的redo日志和undo日志来…

Redis入门基础命令

文章目录 一、redis1.1 redis概述1.2 redis安装 二、string2.1 基础命令2.2 存储结构2.3 应用 三、list3.1 基础命令3.2 应用 四、hash4.1 基础命令4.2 存储结构4.3 应用 五、set5.1 基础命令5.2 存储结构5.3 应用 六、zset6.1 基础命令6.2 存储结构6.3 应用 一、redis 1.1 re…

【C#】MVC页面常见的重定向方式和场景

本篇文章主要简单讲讲&#xff0c;C# MVC 页面常见跳转或者重定向的方式和场景。 在实际项目开发中&#xff0c;在一些特定场景肯定会用到重定向&#xff0c;比如&#xff1a;不同角色跳转到不同视图地址 目录 一、种常见重定向方式1.1、RedirectToAction1.2、RedirectToRoute1…

Java中的队列

队列的理解 队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作。 LinkedList类实现了Queue接口&#xff0c;因此我们可以把LinkedList当成Queue来用。 常用方法 实例 import java.util…

Stable Diffusion服务环境搭建(远程服务版)

Stable Diffusion服务环境搭建&#xff08;远程服务版&#xff09; Stable Diffusion是什么 Stable diffusion是一个基于Latent Diffusion Models&#xff08;潜在扩散模型&#xff0c;LDMs&#xff09;的文图生成&#xff08;text-to-image&#xff09;模型。具体来说&#…

R语言批量将PDF中表格,转化为excel

您好&#xff01;以下是使用R语言将PDF中的表格批量转化为Excel的步骤&#xff1a; 1. 安装必要的包 您需要安装pdftools和tabulizer包。可以通过以下代码来安装它们&#xff1a; install.packages("pdftools") install.packages("tabulizer") 2. 设置…

C# IO FileStream流(一)使用整理

一、C# IO 文件流&#xff0c;常用操作整理 来自其他开发者的整理&#xff1a; 文件操作常用相关类 1)Directory //操作目录&#xff08;文件夹&#xff09;&#xff0c;静态类。2)Path//静态类&#xff0c;对文件或目录的路径进行操作&#xff08;很方便&#xff09;【字符…

[深度学习实战]基于PyTorch的深度学习实战(中)[线性回归、numpy矩阵的保存、模型的保存和导入、卷积层、池化层]

目录 一、前言二、线性回归2.1 训练代码2.2 绘图部分代码2.3 numpy 数组的保存和导入代码2.4 完整代码 三、numpy矩阵的保存四、模型的保存和导入4.1 保存模型4.2 导入模型 五、卷积层5.1 Conv2d5.1.1 函数定义5.1.2 参数说明5.1.3 测试代码5.1.4 最终结果 5.2 Conv1d5.2.1 函数…

element ui 上传控件携带参数到后端

1.携带固定参数&#xff1a; 2.携带不固定参数&#xff1a; <el-row> <el-col :span"24"> <el-upload :multiple"false" :show-file-list"false" :on-success"f_h…

ShardingSphere分库分表实战之MySQL主从集群搭建

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

Java并发编程学习笔记(一)线程的入门与创建

一、进程与线程 认识 程序由指令和数据组成&#xff0c;简单来说&#xff0c;进程可以视为程序的一个实例 大部分程序可以同时运行多个实例进程&#xff0c;例如记事本、画图、浏览器等少部分程序只能同时运行一个实例进程&#xff0c;例如QQ音乐、网易云音乐等 一个进程可以…

【C++进阶之路】适配器、反向迭代器、仿函数

文章目录 前言一、适配器①模拟实现栈②模拟实现对列 二、反向迭代器三、仿函数总结 前言 我们先来笼统的介绍一下今天的三个内容。 适配器——简单的理解就是复用&#xff0c;用已经实现的轮子&#xff0c;来继续实现某种功能。 反向迭代器——原理很简单&#xff0c;就是对…

笔记:NodeJS electron 打包时 ETIMEDOUT

第一个方法 如果是用 npm&#xff0c;在你的 cmd 中输入 npm config set ELECTRON_MIRROR https://npmmirror.com/mirrors/electron/如果用 yarn&#xff0c;就输入 yarn config set electron_mirror https://npmmirror.com/mirrors/electron/第二个方法 如果第一个方法不行…

摄影测量-共线方程、共面方程

1、共线方程 在摄影测量中&#xff0c;绝大多数的结算方法都是基于共线条件方程式的&#xff0c;如单片空间后方交会解法、像对空间前方交会解法、光束法区域网评查以及直接线性变换等。 2、共面方程 描述像片对内摄影基线以及同名光线位于同一平面的一种条件方程。在摄影测量…

深入探究 SOCKS5 代理:加强网络安全与高效爬虫的利器

一、 SOCKS5 协议简介 SOCKS5&#xff08;Socket Secure 5&#xff09;是 SOCKS 协议的最新版本&#xff0c;它允许客户端向代理服务器发送请求&#xff0c;并将数据传输到目标服务器。相比于旧版 SOCKS 协议&#xff0c;SOCKS5 提供了更强大的身份验证机制和数据加密功能&…

分表后mybatis-plus删除操作失效等问题处理

因为重构dao层&#xff0c;问题太多了&#xff0c;于是想着另起一个章节。 4 count的问题 使用count复用&#xff0c;不需要查询所有字段&#xff0c;否则会出现下面的错误 ### SQL: SELECT COUNT( t.id,t.company_id,t.user_id,t.bind_time,t.role_type,t.job_type,t.studen…

openSUSE leap 15.3安装mysql-community-server

openSUSE Software 下载"https://software.opensuse.org/ymp/home:bjoernv/15.3/mysql-community-server.ymp" wget "https://software.opensuse.org/ymp/home:bjoernv/15.3/mysql-community-server.ymp" 双击"mysql-community-server.ymp" 添…

【算法基础:搜索与图论】3.2 树与图的dfs和bfs

文章目录 例题846. 树的重心&#xff08;深度优先遍历 / 树形DP&#xff09;⭐⭐⭐⭐⭐&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;&#xff08;重要&#xff01;好题&#xff01;&#xff09;847. 图中点的层次 相关链接 要学会建树、建图的通用方法。…