【发布时间】:2019-03-21 07:12:00
【问题描述】:
我正在尝试创建一个带有可拖动标记的 Matplotlib 散点图。
我在 Matplotlib 网站上找到了一个可拖动的矩形示例,https://matplotlib.org/users/event_handling.html。该方法似乎是创建一个 DraggableRectangle 类来处理鼠标事件,并为条形图中的每个矩形进行初始化和连接。
我尝试用散点图做类似的事情,但是当我尝试遍历标记时,我得到一个 typeError: 'PathCollection' object is not iterable。
import numpy as np
import matplotlib.pyplot as plt
class DraggableMarker:
def __init__(self, marker):
self.marker = marker
def connect(self):
self.cidpress = self.rect.figure.canvas.mpl_connect(
'button_press_event', self.on_press)
self.cidrelease = self.rect.figure.canvas.mpl_connect(
'button_release_event', self.on_release)
self.cidmotion = self.rect.figure.canvas.mpl_connect(
'motion_notify_event', self.on_motion)
def on_press(self, event):
pass
def on_motion(self, event):
pass
def on_release(self, event):
pass
def disconnect(self):
self.rect.figure.canvas.mpl_disconnect(self.cidpress)
self.rect.figure.canvas.mpl_disconnect(self.cidrelease)
self.rect.figure.canvas.mpl_disconnect(self.cidmotion)
fig, ax = plt.subplots(1, 1)
markers = ax.scatter(np.random.rand(10), np.random.rand(10), marker ='o')
draggable_markers = []
for marker in markers:
draggable_marker = DraggableMarker(marker)
draggable_marker.connect()
draggable_markers.append(draggable_marker)
plt.show()
这样做的正确方法是什么?
【问题讨论】:
-
一个 PathCollection 将其成员的位置存储在其中。这些可以通过
get_offsets和set_offsets访问。一般来说,查看matplotlib.org/gallery/event_handling/path_editor.html 或matplotlib.org/gallery/event_handling/poly_editor.html 在这里可能会更有帮助。 -
@ImportanceOfBeingErnest 感谢您为我指明了正确的方向。似乎 get_offsets 根据图表的值返回 x,y 值,其中我的鼠标按钮事件正在返回基于像素的位置。所以,我需要弄清楚这一点,但我正在再次取得进展。
标签: python python-3.x matplotlib