我正在尝试更改交互式缩放到矩形的行为,以便根据新的可见x轴范围在y轴上自动缩放数据。确实,我正在探索大量具有大动态的遥测数据,并且需要进行大量的来回缩放。因此,最好对y轴进行自动缩放。经过大量谷歌搜索和搜索论坛后,我发现没有任何东西可以帮助实现这一目标。还是我搜索错误。 有人可以给我一些指导吗?
答案 0 :(得分:1)
一种选择是连接到xlim_changed
信号,并基于当前的x限制计算y轴的新限制,以便包括所有数据。
以下操作可以做到这一点,并且比起初想的要复杂一些,因为仅设置y限制将不起作用,因为它们会被缩放触发的(同时)ylim_changed
事件覆盖。因此,有一个设置为10毫秒的计时器,该计时器在处理完该事件后会人为设置。
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
class AutoScaleY():
def __init__(self, line, margin=0.05):
self.margin = margin
self.line = line
self.ax = line.axes
self.ax.callbacks.connect('xlim_changed', self.rescale_y)
def rescale_y(self,evt=None):
xmin, xmax = ax.get_xlim()
x, y = line.get_data()
cond = (x >= xmin) & (x <= xmax)
yrest = y[cond]
margin = (yrest.max()-yrest.min())*self.margin
self.ybounds = [yrest.min()-margin, yrest.max()+margin]
self.timer = self.ax.figure.canvas.new_timer(interval=10)
self.timer.single_shot = True
self.timer.add_callback(self.change_y)
self.timer.start()
def change_y(self):
self.ax.set_ylim(self.ybounds)
self.ax.figure.canvas.draw()
x=np.linspace(0,100,1001)
y = np.sin(x/16) + np.cumsum(np.random.randn(1001))/30.
fig, ax = plt.subplots()
line, = ax.plot(x,y)
r = AutoScaleY(line)
plt.show()