这篇文章给大家介绍怎么在matplotlib中实现一个交互式数据光标效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
mplcursors
包也可以为matplotlib
提供交互式的数据光标(弹出式注释框),它的灵感来源于mpldatacursor
包,可以认为是基于mpldatacursor
包的二次开发。
相对于mpldatacursor
包,mplcursors
包最大的特点就是提供了一些相对底层的API,这样功能实现更加灵活。
pip install mplcursors
mplcursors
包的基本应用方法与mpldatacursor
包类似,直接应用cursor
函数即可。
鼠标左键单击图表数据元素时会弹出文本框显示最近的数据元素的坐标值。
鼠标右键单击文本框取消显示数据光标。
按d键时切换显示\关闭数据光标。
import matplotlib.pyplot as plt import numpy as np import mplcursors data = np.outer(range(10), range(1, 5)) fig, ax = plt.subplots() lines = ax.plot(data) ax.set_title("Click somewhere on a line.\nRight-click to deselect.\n" "Annotations can be dragged.") mplcursors.cursor(lines) # or just mplcursors.cursor() plt.show()
mpldatacursor
包中自定义功能主要通过向datacursor
函数传递实参实现。mplcursors
包中的cursor
函数对标mpldatacursor
包中的datacursor
函数,但是在参数上发生了变化,保留了artists
、hover
、bindings
、multiple
、highlight
等类似参数。mplcursors
包增加Selection
对象(底层为namedtuple
)表示选择的数据元素的属性。
当选中某个数据点时,可以通过添加(add
)或删除(remove
)事件触发、注册回调函数实现功能,回调函数只有一个参数,及选择的数据点。
在注册回调函数时,mplcursors
包支持使用装饰器。
下面以修改显示文本信息为例对比下mpldatacursor
与mplcursors
的不同实现方式。
import matplotlib.pyplot as plt import numpy as np from mpldatacursor import datacursor ax=plt.gca() labels = ["a", "b", "c"] for i in range(3): ax.plot(i, i,'o', label=labels[i]) datacursor(formatter='{label}'.format) plt.show()
mplcursors
实现方式一
import matplotlib.pyplot as plt import numpy as np import mplcursors ax=plt.gca() lines = ax.plot(range(3), range(3), "o") labels = ["a", "b", "c"] cursor = mplcursors.cursor(lines) cursor.connect( "add", lambda sel: sel.annotation.set_text(labels[sel.target.index])) plt.show()
mplcursors
实现方式二
import matplotlib.pyplot as plt import numpy as np import mplcursors ax=plt.gca() lines = ax.plot(range(3), range(3), "o") labels = ["a", "b", "c"] cursor = mplcursors.cursor(lines) @cursor.connect("add") def on_add(sel): sel.annotation.set_text(labels[sel.target.index]) plt.show()
mplcursors
包实现的功能与mpldatacursor
包非常相似。相对而言mplcursors
包的API更加灵活,通过connect
函数或者装饰器自定义属性耦合性更弱,便于实现绘图与数据光标实现的分离。
关于怎么在matplotlib中实现一个交互式数据光标效果就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。