如何使matplotlib缩放和平移工具使用线标记

2024-04-27 23:47:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我开发了一个程序,可以绘制出光谱仪的输入信号。我正在尝试与之通信的设备被评定为发送不超过3像素的坏信息(这部分是不可避免的)。我要做的是让一个选择器挑选出3个可能的坏数据位,这样我就可以在固件中解释它们,因为这三个点没有改变。到目前为止,我的应用程序可以激活选择器(通过ctrl-shift-f12热键),并且可以按预期选择和取消选择数据点。当我试图使用NabigationToolbar2Wx()中提供的matplotlibs缩放或平移工具时,问题就出现了。当我尝试使用其中一种时,我会得到: ValueError: 'markevery' is iterable but not a valid form of numpy fancy indexing; markevery=[283, 286, 290, 292] 我使用的是python2.7.9,matplotlib和wxPython演示。在

def on_pixel_picker(self, event):
    self.CaptureMouse()
    mouseevent = event.mouseevent
    line = self.axes.get_lines()[0]
    index = list(line.get_xdata()).index(int(mouseevent.xdata))
    if mouseevent.button is not 1:
        try:
            self.markers.remove(index)
        except ValueError:
            pass
        line.set_markevery(self.markers)
        self.figure.canvas.draw()
        self.ReleaseMouse()
        return
    if index in self.markers:
        return
    self.markers.append(index)
    self.markers.sort()
    line.set_marker('o')
    line.set_markevery(self.markers)
    self.figure.canvas.draw()
    self.ReleaseMouse()

回溯如下:

^{pr2}$

你知道我为什么会犯这个错误吗?我该怎么解决它?我的数据点非常接近,所以这个缩放和平移功能是必要的。在


Tags: 数据selfeventgetindexislinenot
1条回答
网友
1楼 · 发布于 2024-04-27 23:47:13

我为那些感兴趣或可能有同样问题的人想出了这个办法。我先把这个问题解释清楚一点。当向左平移绘图时,标记将保持在屏幕上与图形移动相同的位置;这意味着当您移动图形时,标记将跟踪图形。如果您将其向左移动到该点落在直线上,则发生异常。如果您将它移到右侧,标记将保持在行上的正确位置,但如果您将其移出屏幕,则会发生异常。工具栏上的缩放工具根本不起作用。我一点击它就给了我一个例外。深入了解matplotib源代码线条.py第730行左右,它检查markevery并相应地绘制;但是,如果markevery不在可见索引中,则会发生异常。在

    if markevery is not None:
        subsampled = _mark_every_path(new_markevery, tpath,
                                      affine, self.axes.transData)

我做了修正:

^{pr2}$

以确保点是可见的,并获取t路径顶点,而不是整个路径的索引。这是阻止它在平移时跟踪图形的关键。此修复还解决了缩放工具的问题。在

相关问题 更多 >