无法解压缩不可迭代的AxesSubplot对象-Matplotlib

问题描述

我正在用python创建一个函数,该函数使我可以创建两个平行的图,并且它们共享两个轴:

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',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",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,color="orange")
    ax2.axhline(20,color="green")
    ax2.axhline(30,color="red")
    ax2.axhline(70,color="red")
    ax2.axhline(80,color="green")
    ax2.axhline(90,color="orange")
    ax2.axhline(100,color="grey")

但是给了我cannot unpack non-iterable Axessubplot object错误

[Command: python -u C:\Users\Nicolò\Documents\Git\progettoTradingBot\progettoTradeBot\GUIprova2.py]
C:\Users\Nicolò\Documents\Git\progettoTradingBot\progettoTradeBot\BollingerBandsFinal.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:\Users\Nicolò\Documents\Git\progettoTradingBot\progettoTradeBot\BollingerBandsFinal.py:63: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a prevIoUs axes currently reuses the earlier instance.  In a future version,by passing a unique label to each axes instance.
  ax = f.add_subplot(111)
Traceback (most recent call last):
  File "C:\Users\Nicolò\AppData\Local\Programs\Python\python38\lib\site-packages\matplotlib\cbook\__init__.py",line 196,in process
    func(*args,**kwargs)
  File "C:\Users\Nicolò\AppData\Local\Programs\Python\python38\lib\site-packages\matplotlib\animation.py",line 951,in _start
    self._init_draw()
  File "C:\Users\Nicolò\AppData\Local\Programs\Python\python38\lib\site-packages\matplotlib\animation.py",line 1743,in _init_draw
    self._draw_frame(next(self.new_frame_seq()))
  File "C:\Users\Nicolò\AppData\Local\Programs\Python\python38\lib\site-packages\matplotlib\animation.py",line 1766,in _draw_frame
    self._drawn_artists = self._func(framedata,*self._args)
  File "C:\Users\Nicolò\Documents\Git\progettoTradingBot\progettoTradeBot\GUIprova2.py",line 48,in animate
    PlotManager(BollingerBands(df,f),RSI(df,f2),f)
  File "C:\Users\Nicolò\Documents\Git\progettoTradingBot\progettoTradeBot\mostraGrafici.py",line 7,in PlotManager
    f,sharex=True)
TypeError: cannot unpack non-iterable Axessubplot object

如何处理此错误

解决方法

plt.subplots(2,1,...)的值是一个元组figure,array(subplot0,subplot1),因此您可以正确地解压缩一个图形和两个子图。

相反,fig.subplots(2,...)的值为subplot0,subplot1(因为您已经有了这个数字……),而当您尝试打开包装时,它的值等同于

f = subplot0
ax0,ax1 = subplot1

这导致TypeError: cannot unpack non-iterable AxesSubplot object


由于下面没有使用标记为f的对象,因此您应该编写

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