Не удается распаковать не итерируемый объект AxesSubplot- Matplotlib

#python #matplotlib #iterable-unpacking

#python #matplotlib #итерируемый-распаковка

Вопрос:

Я создаю функцию на python, которая позволяет мне создавать два параллельных графика, и они разделяют свои 2 оси:

 def PlotManager(data1,data2,fig):
    f, (ax1, ax2) = fig.subplots(2, 1, sharey=True,sharex=True)

    #Plot1 sopra
    x_axis = data1.index
    #Plot and shade the area between the upperband and the lower band grey
    ax1.fill_between(x_axis,data1['Upper'],data1['Lower'], color = 'grey', alpha= 0.5)
    #Plot the closing price and the moving average
    ax1.plot(x_axis,data1['Close'],color = 'gold',lw = 3,label = 'Close Price', alpha= 0.5)
    ax1.plot(x_axis,data1['SMA'],color = 'blue',lw = 3,label = 'Simple Moving Average', alpha= 0.5)
    ax1.scatter(x_axis,data1['Buy'],color="green", lw=3,label="Buy",marker = "^", alpha=1)
    ax1.scatter(x_axis,data1['Sell'],color="red", lw=3,label="Sell",marker = "v", alpha = 1)
    #Set the title and show the image
    ax1.set_title("Bollinger Band for Amazon")
    plt.xticks(rotation = 45)

    #Plot 2 Sotto
    ax2.set_title('RSI_Plot')
    ax2.plot(x_axis,data2['RSI'])
    ax2.axhline(0,linestyle='--',alpha=0.5, color="grey")
    ax2.axhline(10,linestyle='--',alpha=0.5, color="orange")
    ax2.axhline(20,linestyle='--',alpha=0.5, color="green")
    ax2.axhline(30,linestyle='--',alpha=0.5, color="red")
    ax2.axhline(70,linestyle='--',alpha=0.5, color="red")
    ax2.axhline(80,linestyle='--',alpha=0.5, color="green")
    ax2.axhline(90,linestyle='--',alpha=0.5, color="orange")
    ax2.axhline(100,linestyle='--',alpha=0.5, color="grey")
  

Но выдает cannot unpack non-iterable AxesSubplot object ошибку:

 [Command: python -u C:UsersNicolòDocumentsGitProgettoTradingBotProgettoTradeBotGUIprova2.py]
C:UsersNicolòDocumentsGitProgettoTradingBotProgettoTradeBotBollingerBandsFinal.py:63: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
  ax = f.add_subplot(111)
C:UsersNicolòDocumentsGitProgettoTradingBotProgettoTradeBotBollingerBandsFinal.py:63: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.
  ax = f.add_subplot(111)
Traceback (most recent call last):
  File "C:UsersNicolòAppDataLocalProgramsPythonPython38libsite-packagesmatplotlibcbook__init__.py", line 196, in process
    func(*args, **kwargs)
  File "C:UsersNicolòAppDataLocalProgramsPythonPython38libsite-packagesmatplotlibanimation.py", line 951, in _start
    self._init_draw()
  File "C:UsersNicolòAppDataLocalProgramsPythonPython38libsite-packagesmatplotlibanimation.py", line 1743, in _init_draw
    self._draw_frame(next(self.new_frame_seq()))
  File "C:UsersNicolòAppDataLocalProgramsPythonPython38libsite-packagesmatplotlibanimation.py", line 1766, in _draw_frame
    self._drawn_artists = self._func(framedata, *self._args)
  File "C:UsersNicolòDocumentsGitProgettoTradingBotProgettoTradeBotGUIprova2.py", line 48, in animate
    PlotManager(BollingerBands(df,f),RSI(df,f2),f)
  File "C:UsersNicolòDocumentsGitProgettoTradingBotProgettoTradeBotmostraGrafici.py", line 7, in PlotManager
    f, (ax1, ax2) = fig.subplots(2, 1, sharey=True,sharex=True)
TypeError: cannot unpack non-iterable AxesSubplot object
  

Как я могу справиться с этой ошибкой?

Ответ №1:

Значение plt.subplots(2, 1, ...) является кортежем figure, array(subplot0, subplot1) , чтобы вы могли правильно распаковать фигуру и два подзаголовка.

Напротив, значение fig.subplots(2, 1, ...) равно subplot0, subplot1 (потому что у вас УЖЕ есть фигура …), И когда вы пытаетесь распаковать, это эквивалентно

 f = subplot0
ax0, ax1 = subplot1
  

и это приводит к TypeError: cannot unpack non-iterable AxesSubplot object


Поскольку вы не используете объект, помеченный как f в следующем, вы должны написать

 ax1, ax2 = fig.subplots(2, 1, sharey=True,sharex=True)