gwpy icon indicating copy to clipboard operation
gwpy copied to clipboard

AttributeError: module 'matplotlib.pyplot' has no attribute 'FigureManagerBase' in Google Colab

Open rohan-paul opened this issue 4 years ago • 5 comments
trafficstars

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

rohan-paul avatar Aug 25 '21 11:08 rohan-paul

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

blois avatar Aug 25 '21 15:08 blois

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

Thanks so much @blois . That works great for now.

rohan-paul avatar Aug 25 '21 18:08 rohan-paul

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.

rohan-paul avatar Aug 25 '21 18:08 rohan-paul

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 avatar Aug 25 '21 18:08 tacaswell

@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?

duncanmmacleod avatar Oct 04 '21 07:10 duncanmmacleod