y轴自动缩放的交互式缩放

时间:2018-11-15 18:53:13

标签: matplotlib

我正在尝试更改交互式缩放到矩形的行为,以便根据新的可见x轴范围在y轴上自动缩放数据。确实,我正在探索大量具有大动态的遥测数据,并且需要进行大量的来回缩放。因此,最好对y轴进行自动缩放。经过大量谷歌搜索和搜索论坛后,我发现没有任何东西可以帮助实现这一目标。还是我搜索错误。 有人可以给我一些指导吗?

1 个答案:

答案 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()