12 votes

problèmes liés à matplotlib et libpng avec ipython notebook

J'ai essayé d'utiliser le bloc-notes ipython . J'ai installé toutes les bibliothèques nécessaires. Cependant, je ne peux pas utiliser l'option "--pylab=inline" lors du lancement d'ipython ou la fonction "savefig" dans la console Ipython. Lorsque j'ai essayé d'utiliser l'une ou l'autre de ces fonctions, un message d'erreur est apparu : "RuntimeError : Could not create write struct" résultant de l'exécution de matplotlib. De plus, un avertissement provenant de l'invite de notebookApp disait "libpng warning : Application construite avec libpng-1.2.41 mais fonctionnant avec 1.5.13".

Cependant, j'ai installé la dernière version de libpng (1.5.13), désinstallé matplotlib avec pip uninstall et réinstallé matplotlib avec pip install (et pendant le processus de construction, je peux voir que libpng1.5.13 est utilisé pour la construction de matplotlib).

La configuration de mon système est Mac OS X10.6, python2.7. Quelqu'un a une expérience similaire ou des suggestions ?

Voici les erreurs de traçage :

[<matplotlib.lines.Line2D at 0x106066d50>]
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/zmq/pylab/backend_inline.pyc in show(close)
    100     try:
    101         for figure_manager in Gcf.get_all_fig_managers():
--> 102             send_figure(figure_manager.canvas.figure)
    103     finally:
    104         show._to_draw = []

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/zmq/pylab/backend_inline.pyc in send_figure(fig)
    209     """
    210     fmt = InlineBackend.instance().figure_format
--> 211     data = print_figure(fig, fmt)
    212     # print_figure will return None if there's nothing to draw:
    213     if data is None:

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/pylabtools.pyc in print_figure(fig, fmt)
    102     try:
    103         bytes_io = BytesIO()
--> 104         fig.canvas.print_figure(bytes_io, format=fmt, bbox_inches='tight')
    105         data = bytes_io.getvalue()
    106     finally:

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
   2050                     orientation=orientation,
   2051                     dryrun=True,
-> 2052                     **kwargs)
   2053                 renderer = self.figure._cachedRenderer
   2054                 bbox_inches = self.figure.get_tightbbox(renderer)

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/backends/backend_agg.pyc in print_png(self, filename_or_obj, *args, **kwargs)
    501             _png.write_png(renderer._renderer.buffer_rgba(),
    502                            renderer.width, renderer.height,
--> 503                            filename_or_obj, self.figure.dpi)
    504         finally:
    505             if close:

RuntimeError: Could not create write struct

Merci beaucoup,

Jie

7voto

Matt Swain Points 1467

J'ai eu le même problème sur OS X Mavericks avec libpng installé via homebrew et XQuartz installé. Il s'est avéré que matplotlib trouvait l'ancienne version de libpng de XQuartz lors de la compilation, mais trouvait la libpng homebrew plus récente lors de l'exécution.

La meilleure solution que j'ai trouvée est celle de ce commentaire de jaengelberg sur github : Désinstaller matplotlib, renommer temporairement les en-têtes libpng de XQuartz pour qu'ils ne soient pas trouvés, installer matplotlib, puis changer à nouveau les noms des en-têtes.

Le voici dans son intégralité :

pip uninstall matplotlib
cd /opt/X11/include/libpng15
sudo mv png.h _png.h
sudo mv pngconf.h _pngconf.h
sudo mv pnglibconf.h _pnglibconf.h
pip install matplotlib
sudo mv _png.h png.h
sudo mv _pngconf.h pngconf.h
sudo mv _pnglibconf.h pnglibconf.h

4voto

David E. Points 133

J'ai eu le même problème en essayant de visualiser des images d'OpenCV dans le Notebook Jupyter alors que je travaillais dans un environnement Anaconda. La réinstallation forcée de matplotlib a fonctionné pour moi :

pip install -U --force-reinstall matplotlib

J'ai trouvé cette méthode en consultant ce lien GitHub de la solution de Matt.

4voto

loknar Points 459

Pour moi, mettre

%matplotlib inline

avant que toutes les importations de matplotlib ne résolvent ce problème

2voto

khstacking Points 627

J'ai également rencontré ce problème. Une autre solution consiste à modifier le format dans lequel le bloc-notes rendra les images, de "png" à "svg". Cela peut être fait dans votre fichier de configuration . La mine est située à :

~/.ipython/profile_default/ipython_notebook_config.py

Il y a une ligne qui ressemble à ceci

# c.InlineBackend.figure_format = 'png'

Le fait de décommenter et de changer pour "svg" a fait l'affaire pour moi :

c.InlineBackend.figure_format = 'svg'

1voto

jtaylor Points 829

Peut-être qu'il charge la mauvaise libpng au moment de l'exécution. Si vous avez construit matplotlib avec libpng 1.5, assurez-vous que vous l'utilisez également. libpng 1.2 et 1.5 ne sont pas compatibles.

dans un shell, vous pouvez définir DYLD_LIBRARY_PATH pour modifier l'emplacement où l'éditeur de liens recherche les bibliothèques en premier.

otool -L /<somepath>/matplotlib/_png.so

devrait vous indiquer ce que matplotlib trouve au moment de l'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X