Mtaplotlib AttributeError: 'module' object has no attribute 'pyplot'

attributes, matplotlib, python-2.7

Solution

You are shadowing a system file and getting a circular import.

Note that the first and last file of your trace back are trying it import from the same file.

Change the name of your file to something else (and remove the `pyc` file) and it should work.

Also see matplotlib not working anymore due to interactive issue which had a similar problem.

Problem

Before anyone says "duplicate question" or anything, please read on, it's not the same as other questions. So when i run my small program; ``` python numbers.py ``` where ``` $ file `which python` /usr/bin/python: symbolic link to 'python2.7' $ file `which python2.7` /usr/bin/python2.7: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x623b662458af705775fcbd2576ca06eaa82bc482, stripped ``` and i'm using matplotlib version 1.2; ``` /usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/ ``` I have tried several approaches to get it to work; ``` from matplotlib import pyplot as plt import matplotlib.pyplot as plt ``` neither of them work. they both give the same error; ``` $ python numbers.py Traceback (most recent call last): File "numbers.py", line 1, in <module> import matplotlib.pyplot as plt File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/pyplot.py", line 26, in <module> from matplotlib.figure import Figure, figaspect File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 34, in <module> import matplotlib.colorbar as cbar File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/colorbar.py", line 29, in <module> import matplotlib.collections as collections File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/collections.py", line 23, in <module> import matplotlib.backend_bases as backend_bases File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/backend_bases.py", line 51, in <module> from PIL import Image File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 90, in <module> import numbers File "/home/will/Documents/python/numbers/numbers.py", line 1, in <module> import matplotlib.pyplot as plt AttributeError: 'module' object has no attribute 'pyplot' ``` What is really frustrating, is that i have another file, with `from matplotlib import pyplot as plt` at the top, and it works fine. I can't see any reason why one would work and the other wouldn't... I tried changing the file name too, so that it wasn't `numbers.py` but that didnt' work either. Has anyone come across this before and fixed it? Or know why it doesn't work? Here's the full file: ``` from matplotlib import pyplot as plt def toString(number): if type(number) == float: return floatToString(number) elif type(number) == int: return intToString(number) elif type(number) == complex: return complexToString(number) else: return "NaN" def intToString(number): if number < 0: return "minus " + intToStringPos(abs(number)) else: return intToStringPos(number) def intToStringPos(number): upTo20 = [""] + "one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen".split() tenTimes = "twenty thirty fourty fifty sixty seventy eighty ninety hundred".split() logs = [""] + "thousand million billion trillion quadrillion".split() if len(str(number)) > 3: #split number into groups of three, from the right hand end number = list(reversed(str(number))) groups = list(reversed([int("".join(reversed([number[i+j] for j in range(3) if i+j < len(number)]))) for i in range(0, len(number), 3)])) retString = "" for i, number in enumerate(reversed(groups)): if number == 0: continue elif i == 0 and len(str(number)) < 3: if number != 0: retString = "and " + intToString(number) else: retString = intToString(number) + " " + logs[i] + " " + retString return retString.strip() elif 1000 > number > 99: tens = intToString(int(str(number)[1:])) if tens != "zero": return upTo20[number/100] + " hundred and " + tens else: return upTo20[number/100] elif 100 > number >= 20: return tenTimes[number/10-2] + " " + upTo20[number - 10*(number/10)] elif 0 < number < 20: return upTo20[number] elif number == 0: return "zero" def floatToString(number): integerPart, decimalPart = divmod(number,1) retString = intToString(int(integerPart)) if decimalPart > 0.0: return retString + " point " + " ".join([intToString(int(d)) for d in str(decimalPart)[2:]]) else: return retString def complexToString(number): retString = [] if number.real > 0.0: retString.append(floatToString(number.real)) if number.imag > 0.0: if number.imag == 1: retString.append("j") else: retString.append(floatToString(number.imag) + " j") return " plus ".join(retString) lengths = [] for number in range(1000): print toString(number) lengths.append(len(toString(number))) print lengths plt.plot(range(1000), lengths) plt.pyplot.show() ```

Original source

Related problems