-
-
Notifications
You must be signed in to change notification settings - Fork 35
Open
Description
While attempting to create a piano roll with librosa and matplotlib, like this:
def plot_piano_roll(pm, start_pitch, end_pitch, fs=100):
# Use librosa's specshow function for displaying the piano roll
librosa.display.specshow(pm.get_piano_roll(fs)[start_pitch:end_pitch],
hop_length=1, sr=fs, x_axis='time', y_axis='cqt_note',
fmin=pretty_midi.note_number_to_hz(start_pitch))
plt.figure(figsize=(8, 4))
plot_piano_roll(pm, 56, 70)
I encounter this error:
AttributeError Traceback (most recent call last)
File ~/anaconda3/lib/python3.9/site-packages/matplotlib_inline/backend_inline.py:100, in show(close, block)
97 # only call close('all') if any to close
98 # close triggers gc.collect, which can be slow
99 if close and Gcf.get_all_fig_managers():
--> 100 matplotlib.pyplot.close('all')
File ~/anaconda3/lib/python3.9/site-packages/matplotlib/_api/__init__.py:226, in caching_module_getattr.<locals>.__getattr__(name)
224 if name in props:
225 return props[name].__get__(instance)
--> 226 raise AttributeError(
227 f"module {cls.__module__!r} has no attribute {name!r}")
AttributeError: module 'matplotlib' has no attribute 'pyplot'
The error seems to be fixed if I explicitly declare import matplotlib.pyplot as plt at the start of the file and then use that to call it like this: plt.close('all'). If that alone is satisfactory, I would request to do a PR.
Activity
QuLogic commentedon Apr 21, 2023
This, or some variant of it, is the correct fix. Because
matplotlib.pyplotis not explicitly imported, it may or may not exist at the time of this call, depending on what previous code did. The simplest change would be:if close and Gcf.get_all_fig_managers(): + import matplotlib.pyplot matplotlib.pyplot.close('all')agucova commentedon Jun 14, 2023
@QuLogic That suggested fix won't work, as in the original example the
matplotlibmodule was overwritten silently by librosa, due to their implementation of lazy loading. See here for details.In particular, as long as
import matplotlibis present first, addingimport matplotlib.pyplotwon't work. However, it appears addingimport matplotlib.pyplot as pltdoes work (for reasons that surpass my mortal understanding).While I think such an import should be added (as per your fix), the issue is really upstream with librosa, so I've filed an issue there.