python xycoords_python可视化节点关系(三):matplotlib(2)鼠标交互

实现鼠标交互

1. 实现鼠标点击节点高亮

直接上代码:

# -*- coding: utf-8 -*-

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

from matplotlib.patches import Rectangle

import numpy as np

fig, ax = plt.subplots(figsize=(10,10))

node_pos = [(1, 0), (0, 1), (2,1), (1,2)]

bbox_args = dict(boxstyle="round", fc="0.8")

arrow_args = dict(arrowstyle="->")

an1 = plt.annotate(s="Test 1\n(node1,node2)\n(node3,node4,node5)\n\n\n", xy=node_pos[0], xycoords="data",

va="center", ha="center",

bbox=dict(boxstyle="round", fc="w", facecolor='green'))

an2 = plt.annotate(s="Test 2\n(node1,node2)", xy=node_pos[1], xycoords="data",

va="center", ha="center",

bbox=dict(boxstyle="round", fc="w", facecolor='green'))

arrow1 = plt.annotate('', xy=(0, 0), xycoords=an1,

xytext=(0, 0), textcoords=an2, # an1 -> an2

size=20, ha="center", va="center",

bbox=bbox_args,

arrowprops=dict(patchA=an2,

patchB=an1,

connectionstyle="arc3,rad=0.2",

#color='red',

#linewidth=5,

**arrow_args))

arrow2 = plt.annotate('', xy=(0, 0), xycoords=an2,

xytext=(0, 0), textcoords=an1, # an1 -> an2

size=20, ha="center", va="center",

bbox=bbox_args,

arrowprops=dict(patchA=an1,

patchB=an2,

connectionstyle="arc3,rad=0.2",

#color='red',

#linewidth=5,

**arrow_args))

# callback fun

def mouse_click(event):

if an1.contains(event)[0] == True: # 获取鼠标事件

an1.set_bbox(dict(facecolor='red', alpha= 0.5, boxstyle= 'round'))

fig.canvas.draw() # 切记要加上这句,否则,回调函数中的参数无法更新

axes = plt.gca()

axes.set_xlim([-2,2])

axes.set_ylim([-2,2])

fig.canvas.mpl_connect('button_press_event', mouse_click)

主要就是实现回调函数onclick。通过点击test1,实现背景高亮。

注意

切记要加上fig.canvas.draw(),否则回调函数中的参数无法更新。这个bug找了好久,都是泪。

2. 实现鼠标悬停在节点,显示节点信息。

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

from matplotlib.patches import Rectangle

import numpy as np

fig, ax = plt.subplots(figsize=(10,10))

node_pos = [(1, 0), (0, 1), (2,1), (1,2)]

bbox_args = dict(boxstyle="round", fc="0.8")

arrow_args = dict(arrowstyle="->")

an1 = plt.annotate(s="Test 1\n(node1,node2)\n(node3,node4,node5)\n\n\n", xy=node_pos[0], xycoords="data",

va="center", ha="center",

bbox=bbox_args)

an2 = plt.annotate(s="Test 2\n(node1,node2)", xy=node_pos[1], xycoords="data",

va="center", ha="center",

bbox=bbox_args)

arrow1 = plt.annotate('', xy=(0, 0), xycoords=an1,

xytext=(0, 0), textcoords=an2, # an1 -> an2

size=20, ha="center", va="center",

bbox=bbox_args,

arrowprops=dict(patchA=an2,

patchB=an1,

connectionstyle="arc3,rad=0.2",

#color='red',

#linewidth=5,

**arrow_args))

arrow2 = plt.annotate('', xy=(0, 0), xycoords=an2,

xytext=(0, 0), textcoords=an1, # an1 -> an2

size=20, ha="center", va="center",

bbox=bbox_args,

arrowprops=dict(patchA=an1,

patchB=an2,

connectionstyle="arc3,rad=0.2",

#color='red',

#linewidth=5,

**arrow_args))

#fig.canvas.draw()

node_pos = an1.get_position()

tag1 = plt.annotate(s='hello node1', xy=node_pos, xycoords='data',

color='red',

xytext=(node_pos[0] + 0.3, node_pos[1] + 0.3),

textcoords='data', horizontalalignment="left",

bbox=bbox_args,

annotation_clip=True

)

tag1.set_visible(False)

# callback fun

def mouse_click(event):

if an1.contains(event)[0] == True: # 获取鼠标事件

if an1.get_color() != 'red':

an1.set_color('red') # set font color

an1.set_bbox(dict(facecolor='yellow', alpha=1, boxstyle='round'))

else:

an1.set_color('black') # set font color

an1.set_bbox(bbox_args)

fig.canvas.draw() # 切记要加上这句,否则,回调函数中的参数无法更新

# check mouse enter

def mouse_enter(event):

visible_change_flag = False

visible_flag = an1.contains(event)[0] #注意,这里检查节点an1是否包含鼠标,而不是tag1

if visible_flag != tag1.get_visible():

visible_change_flag = True

tag1.set_visible(visible_flag)

if visible_change_flag:

fig.canvas.draw()

axes = plt.gca()

axes.set_xlim([-2,2])

axes.set_ylim([-2,2])

fig.canvas.mpl_connect('button_press_event', mouse_click)

fig.canvas.mpl_connect('motion_notify_event', mouse_enter)

效果图

注意

这里检查节点an1是否包含鼠标,而不是tag1

鼠标悬停事件是motion_notify_event,而不是button_press_event

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

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

相关文章

java.util.zip.zipexception_android-如何解决java.util.zip.ZipException?

每当我尝试调试和部署我的android应用程序(在Android Studio 0.9中)时,都会出现以下错误:Execution failed for task :app:packageAllDebugClassesForMultiDex.java.util.zip.ZipException: duplicate entry: android/support/multidex/BuildConfig.clas…

处理入参_看看优秀的程序员是如何处理NPE的

点击上方 果汁简历 ,选择“置顶公众号”优质文章,第一时间送达西格玛的博客https://urlify.cn/7j2uMz在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不这头绪,它的出…

udl 连mysql_自己如何正确获取MYSQL的ADO连接字符串

1.在桌面上新建一个空的文本文件mysql.txt,重命名为mysql.udl;2.双击这个mysql.udl文件,打开“数据库连接属性”对话框,在“提供程序”页选择”Micrsoft Ole DB Provider for ODBC Drivers“, 点击下一步;3.在“连接”…

id 怎么获取jira 评论_一篇文章教会你使用Python定时抓取微博评论

【Part1——理论篇】试想一个问题,如果我们要抓取某个微博大V微博的评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存。首先从微博api寻找 抓取评论的接口,如下图…

单片机中存储器扩展位地址线怎么算_51单片机CPU结构各部件的原理详细分析

一、 51单片机串行口工作原理MCS-51系列单片机片内有一个串行I/O端口,通过引脚RXD(P3.0)和TXD(P3.1)可与外设电路进行全双工的串行异步通信。1.串行端口的基本特点8031单片机的串行端口有4种基本工作方式,通…

python format格式化输出填充符号不起作用_Python格式化输出——format用法示例

format OR %提到Python中的格式化输出方法,一般来说有以下两种方式:print(hello %s % world)# hello worldprint(hello {}.format(world))# hello world到底哪种好呢,反正对我来说,用了.format()之后就再也不想用%了。format()不用…

h5弹框滑动 ios_微信 iOS 版更新:细节大更新,你值得拥有

在9月17日,IOS 微信 7.0.7 正式上线了,和一周前安卓 微信 7.0.7 内测版相似,本次的微信更新并没有新功能的上线,更多的是细节上的改变优化。不知道大家有没有发现,iOS版微信从 7.0.5直接跳过7.0.6,直接更新…

jpa onetoone_拥抱开源从表设计到 JPA 实现

long may the sunshine.今天的我拿起键盘就是猛敲代码。果然,十分钟后各种 JPA 报错开始了。跟新手党一样,看到一个错误就解决一个,没有好好思考为什么会出现这样的错误。于是乎,遇到一个解决一个,解决一个又遇到一个&…

python 数据流中的移动平均值_剑指Offer-41-数据流中的中位数

题目题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 例如,[2,3,4] 的中…

vue 全局键盘_如何解决ios input框唤起软键盘不灵敏问题?

为什么移动端点击事件要加300ms延迟呢?早在 2007 年初,苹果公司在发布首款 iPhone 前夕,遇到一个问题:当时的网站都是为大屏幕设备所设计的。于是苹果的工程师们做了一些约定,应对 iPhone 这种小屏幕浏览桌面端站点的问…

css一个盒子里可以装3个图片并排吗_John: CSS浮动与清除浮动属性详解(CSS float clear)...

CSS里的浮动,可以让元素脱离标准流,从左上角或右上角依次贴边排列。下面这个案例将会帮我们了解浮动的基本情况。下面这段代码块,外面是一个大div,里面包含着3个div,第一个左浮动,后两个无浮动。//style样式…

连接驱动_在jdbc中完成对于jdbc参数、jdbc变量,加载驱动,创建连接的封装

JDBC简介JDBC中文含义:Java数据库连接,英文全称:Java Database Connectivity。它是Java语言中用来规范访问数据库的接口,提供了放多接口方法,例如查询 、更新、插入、删除等方法。另外一点要注意的是:JDBC是…

tensorflow 保存训练loss_tensorflow2.0保存和加载模型 (tensorflow2.0官方教程翻译)

最新版本:https://www.mashangxue123.com/tensorflow/tf2-tutorials-keras-save_and_restore_models.html英文版本:https://tensorflow.google.cn/alpha/tutorials/keras/save_and_restore_models翻译建议PR:https://github.com/mashangxue/t…

layui导入模板数据_数据可视化图表 教程echarts,第一讲

1我们写web项目,展示数据的地方,可能会使用到图表。今天就讲这个玩意。本教程暂时定为 三讲:(随后情况,如果有新的研究,会有所更新!)第一讲 饼图的使用第二讲 柱状图的使用第三讲 拆线图的使用此教程希望…

出发a标签_以用户标签为例,复盘B端产品的需求挖掘方法论

阅读指南受众人群:B端初级产品经理阅读收获:B端产品需求挖掘的一些技巧;了解用户标签/画像的一些业务知识。手上负责一个和数据方面有关的B端系统,在日常的产品规划当中,没有关于“用户标签”方面的规划,突…

字符ascii码值转换_没想到 Unicode 字符还能这样玩?

脚本之家你与百万开发者在一起来源 | 程序通事(ID:US_stocks)如若转载请联系原公众号上周的时候,朋友圈的直升飞机不知道为什么就火了,很多朋友开着各种花式飞机带着起飞。图片来自网络还没来得及了解咋回事来着,这个直升飞机就?…

右键菜单无响应_被流氓软件玩坏了?这两个清理工具拯救你凌乱的右键菜单。...

Hello 这里是一周进步我们写了四年近2000篇的干货文章,还分享了许多实用的神器工具,一路以来,感谢大家的支持与陪伴~文 / 一周进步 安哥拉如果你和我们一样,是一个喜欢在电脑上安装各种各样的软件的人,你的电脑右键菜…

python列表超出索引_python列表的切片操作允许索引超出范围

web开发的步骤前端知道是浏览器呈现的部分,相对于前端,后台你可以理解为服务器端专门处理.读取.存储数据库数据的部分. 因为网站是基于B\S架构,即浏览器---服务端架构,就程序来讲,可笼统划分为前端程序和服务器端程 ...const 指针的三种使用方式///const 指针的三种状态/ 注意:…

linux搭建mcpe服务器_Ubuntu Linux下搭建Minecraft我的世界服务器

总结一下在Ubuntu Linux下搭建Minecraft我的世界服务器的方法,其实非常简单直接。(1)、把当前的软件都更新到最新sudo apt-get updateMinecraft服务器需要Java支持。为了检查我们是否已经安装Java,我们执行下面的命令:java -version如果Java已…

supersocke接收不到数据_基于SuperSocket的北斗终端数据接收服务的设计与实现

基于SuperSocket的北斗终端数据接收服务的设计与实现刘朴,莫家勤*【摘要】北斗是我国自主研发的卫星导航定位系统,已经被广泛使用于各个领域,城市交通管理的核心是车辆监控,为了实现车辆的智能管理,获取车辆信息是首要任务,基于北斗二代的车载终端能够精确获取车辆信息,因此实现…