有没有办法限制用户可以在matplotlib中以交互方式平移绘图的范围?
例如,我想将用户的平移范围限制为绘图的正象限,因此x> 1。 0和y> 0,在x = 0和y = 0时有效地创建楼层。
答案 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()
这种限制的用户体验并不是很好,因为某些动作(如移动鼠标)没有得到预期的行为(情节不动);但如果这仍然有意义,就必须自己判断。