chris-kuhr
chris-kuhr

Reputation: 365

AttributeError: 'numpy.ndarray' object has no attribute '_hold'

I am using numpy and matplotlib in Python3.
The following code is causing the error:

import matplotlib
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.axes import Subplot as plt
from matplotlib import pylab


 a=[1,1]
 b=[1,1]
 fsam = 48000         
 w, h = freqz(b, a, worN=2000)
 plt.plot(((fsam-8000) * 0.5 / np.pi) * w, abs(h), label=" ")   

The actual error with matplotlib 1.3.x:

 File "/usr/local/lib/python3.2/dist-packages/matplotlib-1.3.x-py3.2-linux-x86_64.egg/matplotlib/axes.py", line 4119, in plot   
     if not self._hold:   
AttributeError: 'numpy.ndarray' object has no attribute '_hold'   

The actual error with matplotlib 1.2.0:

 Traceback (most recent call last):   
   File "/home/christoph/audio_measurement/AudioTools/AudioTools.py", line 222, in <module>   
       main()   
     File "/home/christoph/audio_measurement/AudioTools/AudioTools.py", line 216, in main   
       form = AppForm()   
     File "/home/christoph/audio_measurement/AudioTools/AudioTools.py", line 39, in __init__   
       self.on_draw()   
     File "/home/christoph/audio_measurement/AudioTools/AudioTools.py", line 80, in on_draw   
       self.transfer = Transfer(self.canvas)   
     File "/home/christoph/audio_measurement/AudioTools/Transfer.py", line 42, in __init__   
       plt.plot(((fsam-8000) * 0.5 / np.pi) * w, abs(h), label=" ")   
     File "/usr/local/lib/python3.2/dist-packages/matplotlib/axes.py", line 3995, in plot   
       if not self._hold: self.cla()   
AttributeError: 'numpy.ndarray' object has no attribute '_hold'   

Transfer is the class, which plots onto the canvas.

I had a look at the length of the coefficients a and b, but they did not effect the result.
I could not find anything on that. Does anyone know whats going wrong?

Upvotes: 4

Views: 13547

Answers (1)

Eryk Sun
Eryk Sun

Reputation: 34260

Normally I'd use import matplotlib.pyplot as plt with plt.plot, plt.subplot, plt.show, etc -- or even just from pylab import *. Anyway, this line

from matplotlib.axes import Subplot as plt

is the reason you have an unbound plot function that's trying to operate on the ndarray argument. Subplot needs to be instantiated. This should work:

import numpy as np
from scipy.signal import freqz

import matplotlib
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.axes import Subplot

fig = Figure()
ax = Subplot(fig, 111)
fig.add_subplot(ax)
canvas = FigureCanvas(fig)

a=[1,1]
b=[1,1]
fsam = 48000         
w, h = freqz(b, a, worN=2000)

ax.plot(((fsam-8000) * 0.5 / np.pi) * w, abs(h), label=" ")
canvas.show()

Upvotes: 1

Related Questions