gwpy
gwpy copied to clipboard
AttributeError: module 'matplotlib.pyplot' has no attribute 'FigureManagerBase' in Google Colab
In Google Colab gwpy package giving error -
AttributeError: module 'matplotlib.pyplot' has no attribute 'FigureManagerBase'
(However, this same code is running all good in local machine ).
I already tried doing full uninstallation and then reinstalled gwpy fresh with the below commands and restarted (reset) the Colab's Machine. But error persists.
!pip install --upgrade --force-reinstall --no-deps gwpy
# And also the below ones
!pip install gwosc
!pip install dqsegdb2
!pip install ligotimegps
My Code, that uses the gwpy package is as below
import pandas as pd
import seaborn as sns
from scipy import signal
from gwpy.timeseries import TimeSeries
from gwpy.plot import Plot
import matplotlib.pyplot as plt
plt.style.use('ggplot')
def get_tseries_from_file(file_name):
t_data = np.load(file_name)
tseries1 = TimeSeries(t_data[0,:], sample_rate=2048)
tseries2 = TimeSeries(t_data[1,:], sample_rate=2048)
tseries3 = TimeSeries(t_data[2,:], sample_rate=2048)
return tseries1, tseries2, tseries3
def plot_tseries(t1, t2, t3):
plot = Plot(t1, t2, t3, separate=True, sharex=True, figsize=[20, 12])
ax = plot.gca()
ax.set_xlim(0, 2)
ax.set_xlabel('Time [s]')
plt.show()
file_1 = root_dir + 'train/0/0/0/000a5b6e5c.npy'
tseries1, tseries2, tseries3 = get_tseries_from_file(file_1)
# Plotting the 3 TimeSeries
plot_tseries(tseries1, tseries2, tseries3)
And getting the following error coming from ../gwpy/plot/plot.py
"module 'matplotlib.pyplot' has no attribute 'FigureManagerBase'"
raceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/gwpy/plot/plot.py in _init_figure(self, **kwargs)
131 try:
--> 132 manager = backend_mod.new_figure_manager_given_figure(num, self)
133 except AttributeError:
AttributeError: module 'ipykernel.pylab.backend_inline' has no attribute 'new_figure_manager_given_figure'
During handling of the above exception, another exception occurred:
AttributeError Traceback (most recent call last)
3 frames
/usr/local/lib/python3.7/dist-packages/gwpy/plot/plot.py in _init_figure(self, **kwargs)
135 pyplot.new_figure_manager.__module__)
136 canvas = upstream_mod.FigureCanvasBase(self)
--> 137 manager = upstream_mod.FigureManagerBase(canvas, 1)
138 manager._cidgcf = manager.canvas.mpl_connect(
139 'button_press_event',
AttributeError: module 'matplotlib.pyplot' has no attribute 'FigureManagerBase'
Additional Info
print(matplotlib.get_backend()) # module://ipykernel.pylab.backend_inline
print(matplotlib.__version__) # 3.4.3
print(gwpy.__version__) # 2.0.4
In matplotlib 3.2.2
import matplotlib.pyplot as plt
pyplot.new_figure_manager.__module__
yields: matplotlib.backend_bases
In matplotlib 3.4.3 it yields: matplotlib.pyplot
This is breaking: https://github.com/gwpy/gwpy/blob/dab7c48e5dda46362a38edac3c81a1d991962b62/gwpy/plot/plot.py#L137
Workaround for now in Colab appears to be to use an earlier version of matplotlib-
!pip install gwpy matplotlib~=3.2.2
In matplotlib
3.2.2import matplotlib.pyplot as plt pyplot.new_figure_manager.__module__yields:
matplotlib.backend_basesIn matplotlib
3.4.3it yields:matplotlib.pyplotThis is breaking:
https://github.com/gwpy/gwpy/blob/dab7c48e5dda46362a38edac3c81a1d991962b62/gwpy/plot/plot.py#L137
Workaround for now in Colab appears to be to use an earlier version of matplotlib-
!pip install gwpy matplotlib~=3.2.2
Thanks so much @blois . That works great for now.
Comment from Matplotlib Project Lead on this
Ah, that is an intentional change on our part (we changed how we do the dependency injection of the backend-specefic details into pyplot from monkey patching a bunch of attributes in the module to only one attribute and then having functions that refer to that one attribute).
I do not think we have ever considered the value of func.module to be part of the public API that we track!
We are unlikely to backout those changes so this will have to be fixed on the gwpy side.
As mention in matplotlib/matplotlib#20901 the change to pyplot.new_figure_manager.__module__ is a consequence of https://github.com/matplotlib/matplotlib/pull/15504 which we are very unlikely to back out on the Matplotlib side.
What exactly is gwpy doing here and why?
@tacaswell et al, apologies for the delay in responding. As I mentioned here:
This is normally an issue when installing gwpy causes matplotlib to be updated, specifically to a version that is incompatible with the preinstalled ipykernel. Updating ipykernel and restarting the runtime normally resolves this issue.
Can someone confirm that upgrading ipykernel to newer >= 5.2.0 and restarting the runtime resolves the issue?