Я написал фрагмент кода, который отображает различные области одного и того же графика (то есть, нанесенные на разные оси), поэтому, когда вы перемещаете / масштабируете одну из осей с помощью панели навигации 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