如何根据Tkinter中的其他限制自动更新matplotlib子图限制?

时间:2017-10-31 00:52:49

标签: python user-interface matplotlib tkinter

我在Tkinter画布中有两个matplotlib子图,用于绘制相同的数据,使用Matplotlib NavigationToolbar2TkAgg按钮供用户导航子图等。我希望顶部面板显示数据的一个区域(xlimits x1到x2),而底部面板根据用户在任一面板中缩放/平移的方式自动显示数据从该区域偏移的内容(xlimits:x1 +偏移到x2 +偏移)。我基本上在Tkinter中寻找sharex / sharey行为,但是通过一些简单的函数操纵限制值。有没有办法捕获导致简单函数的NavigationToolbar事件;或者我是以错误的方式解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以根据另一个绘图的轴限制为一个绘图设置新的轴限制。在两个轴上使用xlim_changed事件调用一个函数,根据当前限制调整另一个图的限制。
在更改限制之前,需要确保断开事件,以便最终无限循环。

以下是一个实施,其中底部图与前一个图相比移动了100个单位。

import numpy as np; np.random.seed(1)
import matplotlib.pyplot as plt

x = np.linspace(0,500,1001)
y = np.convolve(np.ones(20), np.cumsum(np.random.randn(len(x))), mode="same")

fig, (ax, ax2) = plt.subplots(nrows=2)

ax.set_title("original axes")
ax.plot(x,y)
ax2.set_title("offset axes")
ax2.plot(x,y)

offset         = lambda x: x + 100
inverse_offset = lambda x: x - 100

class OffsetAxes():
    def __init__(self, ax, ax2, func, invfunc):
        self.ax = ax
        self.ax2 = ax2
        self.func = func
        self.invfunc = invfunc
        self.cid = ax.callbacks.connect('xlim_changed', self.on_lims)
        self.cid2 = ax2.callbacks.connect('xlim_changed', self.on_lims)
        self.offsetaxes(ax, ax2, func)  

    def offsetaxes(self,axes_to_keep, axes_to_change, func):
        self.ax.callbacks.disconnect(self.cid)
        self.ax2.callbacks.disconnect(self.cid2)
        xlim = np.array(axes_to_keep.get_xlim())
        axes_to_change.set_xlim(func(xlim))
        self.cid = ax.callbacks.connect('xlim_changed', self.on_lims)
        self.cid2 = ax2.callbacks.connect('xlim_changed', self.on_lims)

    def on_lims(self,axes):
        print "xlim"
        if axes == self.ax:
            self.offsetaxes(self.ax, self.ax2, self.func)
        if axes == self.ax2:
            self.offsetaxes(self.ax2, self.ax, self.invfunc)

o = OffsetAxes(ax, ax2, offset, inverse_offset)


plt.show()

enter image description here