限制matplotlib图中的平移范围

时间:2018-02-09 16:12:34

标签: python matplotlib

有没有办法限制用户可以在matplotlib中以交互方式平移绘图的范围?
例如,我想将用户的平移范围限制为绘图的正象限,因此x> 1。 0和y> 0,在x = 0和y = 0时有效地创建楼层。

1 个答案:

答案 0 :(得分:0)

除了将其限制在x或y方向之外,没有内置方法来限制缩放或平移。所以你需要自己实现它。

连接到'xlim_changed''ylim_changed'事件,您可以检查限制是否有效,并可能将其重置为有效范围。

import matplotlib.pyplot as plt
import numpy as np


fig,ax=plt.subplots()

x = np.sin(np.linspace(0,10, 266))+1
ax.plot(x)

class Restrictor():
    def __init__(self, ax, x=lambda x: True,y=lambda x: True):
        self.res = [x,y]
        self.ax =ax
        self.limits = self.get_lim()
        self.ax.callbacks.connect('xlim_changed', lambda evt: self.lims_change(axis=0))
        self.ax.callbacks.connect('ylim_changed', lambda evt: self.lims_change(axis=1))

    def get_lim(self):
        return [self.ax.get_xlim(), self.ax.get_ylim()]

    def set_lim(self, axis, lim):
        if axis==0:
            self.ax.set_xlim(lim)
        else:
            self.ax.set_ylim(lim)
        self.limits[axis] = self.get_lim()[axis]

    def lims_change(self, event=None, axis=0):
        curlim = np.array(self.get_lim()[axis])
        if self.limits[axis] != self.get_lim()[axis]:
            # avoid recursion
            if not np.all(self.res[axis](curlim)):
                # if limits are invalid, reset them to previous state
                self.set_lim(axis, self.limits[axis])
            else:
                # if limits are valid, update previous stored limits
                self.limits[axis] = self.get_lim()[axis]

res = Restrictor(ax, x=lambda x: x>=0,y=lambda x: x>=0)

plt.show()

这种限制的用户体验并不是很好,因为某些动作(如移动鼠标)没有得到预期的行为(情节不动);但如果这仍然有意义,就必须自己判断。