9

Matplotlib 有一个功能,如果您按住“x”或“y”键,它会限制平移或缩放到相应的轴。

有没有办法使它成为默认值?出于某种原因,当按住字母键时,我的 CPU 不允许触摸板移动。而且我只想平移/缩放 x 轴,而不是 y 轴。


编辑:在https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/axes.py#L3001找到平移/缩放功能

其中包含一个内部函数format_deltas。但是当 Axes 对象是从 Figure 对象自动创建时,我不知道如何用子类覆盖 Axes 类。

4

2 回答 2

11

可以使用您自己的轴类。在您的情况下,您可以继承matplotlib.axes.Axes并更改drag_pan方法以始终像按下“x”键一样操作。但是,缩放似乎没有在该类中定义。以下将只允许 x 轴平移:

import matplotlib
import matplotlib.pyplot as plt    

class My_Axes(matplotlib.axes.Axes):
    name = "My_Axes"
    def drag_pan(self, button, key, x, y):
        matplotlib.axes.Axes.drag_pan(self, button, 'x', x, y) # pretend key=='x'

matplotlib.projections.register_projection(My_Axes)

figure = plt.figure()
ax = figure.add_subplot(111, projection="My_Axes")
ax.plot([0, 1, 2], [0, 1, 0])
plt.show()

对于缩放,您可能需要查看工具栏控件本身。NavigationToolbar2类具有drag_zoom似乎与此处相关的方法,但是由于不同的后端都有自己的版本(例如NavigationToolbar2TkAgg

编辑

可以在以下位置修补所需的行为:

import types
def press_zoom(self, event):
    event.key='x'
    matplotlib.backends.backend_tkagg.NavigationToolbar2TkAgg.press_zoom(self,event)
figure.canvas.toolbar.press_zoom=types.MethodType(press_zoom, figure.canvas.toolbar)

您可以正确地执行此操作并创建工具栏的子类,但是您必须创建 Figure、FigureCanvas 和 NavigationToolbar 的实例并将它们放入 Tk 应用程序或其他东西中。我认为没有一种非常简单的方法可以使用您自己的工具栏和简单的绘图界面。

于 2013-05-23T09:15:23.610 回答
4

simonb 的方法有效,但我必须针对press_zoom行为对其进行调整,以使该press_zoom方法成为类的功能,而不是实例,但我添加了一个挂钩来修复每个实例的行为。

import types

def constrainXPanZoomBehavior(fig):
    # make sure all figures' toolbars of this class call a postPressZoomHandler()
    def overrideZoomMode(oldZoom, target):
        def newZoom(self, event):
            oldZoom(self, event)
            if hasattr(self, 'postPressZoomHandler'):
                self.postPressZoomHandler()
        return newZoom
    def overrideToolbarZoom(fig, methodname, functransform, *args):
        toolbar = fig.canvas.toolbar
        oldMethod = getattr(toolbar.__class__, methodname)
        newMethod = functransform(oldMethod, toolbar, *args)
        setattr(toolbar.__class__, methodname, newMethod)
    overrideToolbarZoom(fig, 'press_zoom', overrideZoomMode)

    # for this specific instance, override the zoom mode to 'x' always
    def postPressZoomHandler(self):
        self._zoom_mode = 'x'
    fig.canvas.toolbar.postPressZoomHandler = types.MethodType(postPressZoomHandler, fig.canvas.toolbar)
    return fig
于 2013-05-23T18:03:12.483 回答