Максимальная глубина рекурсии превышена с помощью комбинации из ax.set_xlim () и ax.callbacks.connect ('xlim_changed') - PullRequest
0 голосов
/ 07 декабря 2018

Я написал фрагмент кода, который отображает различные области одного и того же графика (то есть, нанесенные на разные оси), поэтому, когда вы перемещаете / масштабируете одну из осей с помощью панели навигации NavigationToolbar, она настраивает другие на основе предопределенногоfunction.

Вместо того, чтобы иметь это для двух осей, я хотел обобщить класс на любое число осей.Однако, когда я делаю изменения (см. Код ниже), это приводит к ошибке «Превышение максимальной глубины рекурсии» при использовании ax.set_xlim (), даже когда я использую точно такие же две оси.В предыдущей версии кода, которая жестко закодировала две разные оси, все атрибуты и функции работали, поэтому я запутался, как это происходит.Я предполагаю, что matplotlib бесится из-за множества событий, но мне не ясно, как этого избежать, что работает в жестко закодированной версии.

Обобщенный код:

class OffsetAxes():
    def __init__(self, axs):
        self.axs=axs
        self.offsetaxes(axs[0],0)
        return
    def connect(self):
        self.cids=[]
        for ax in self.axs:
            self.cids.append(ax.callbacks.connect('xlim_changed',self.on_change_lims))
        return
    def disconnect(self):
        for ii,ax in enumerate(self.axs):
            self.ax.callbacks.disconnect(self.cids[ii])
        return

    def offsetaxes(self,currentax,axind):
        self.disconnect()
        for ii,ax in enumerate(self.axs):
            if ii!=axind:
                newxlim=GetModifiedLimits()#Function that shift x-limits
                ax.set_xlim(newxlim)#ERROR OCCURS HERE
        self.connect()
        return

    def on_change_lims(self,currentax):
        jj=0
        for ii,ax in enumerate(self.axs):
            if ax==currentax:
                jj=ii
        self.offsetaxes(currentax,jj)
        return

Версия в жестком коде:

def __init__(self, ax1, ax2):
    self.ax1=ax1
    self.ax2=ax2
    self.offsetaxes(self.ax1, self.ax2)
    return
def connect(self):
    self.cidAx1 = self.ax1.callbacks.connect('xlim_changed', self.on_change_lims)
    self.cidAx2 = self.ax2.callbacks.connect('xlim_changed', self.on_change_lims)
def disconnect(self):
    self.ax1.callbacks.disconnect(self.cidAx1)
    self.ax2.callbacks.disconnect(self.cidAx2)
    return

def offsetaxes(self, axes_to_keep, axes_to_change):
    self.disconnect()
    newxlim=GetModifiedLimits()#Function that shift x-limits
    axes_to_change.set_xlim(newxlim)

    self.connect()
    return

def on_change_lims(self, axes):
    if axes == self.ax2:
        self.offsetaxes(self.ax2, self.ax1)
    elif axes == self.ax1:
        self.offsetaxes(self.ax1, self.ax2)
    return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...