python 2.7 - Error:_string_to_bool en mplot3d(solución encontrada)
python-2.7 matplotlib (6)
Añadiendo a la solución de @Hennep:
Añadir la siguiente línea al archivo
/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py
from matplotlib.cbook import _string_to_bool
Y luego cambiar el código a
def grid(self, b=True, **kwargs):
''''''Set / unset 3D grid.
.. note::
Currently, this function does not behave the same as
:meth:`matplotlib.axes.Axes.grid`, but it is intended to
eventually support that behavior.
.. versionchanged :: 1.1.0
This function was changed, but not tested. Please report any bugs.
''''''
# TODO: Operate on each axes separately
if len(kwargs) :
b = True
self._draw_grid = _string_to_bool(b)
Quite la palabra maxes
de la función y todo funcionará bien para mí si hiciera esto.
Edición: solución al final de esta publicación.
Estaba tratando de ejecutar algunos de los ejemplos proporcionados here y here .
Uno de estos ejemplos fue:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection=''3d'')
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=4, cstride=4, color=''b'')
plt.show()
Esto me dio el siguiente error:
/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py:842: MatplotlibDeprecationWarning: The set_scale function was deprecated in version 1.3.
self.zaxis.set_scale(''linear'')
Traceback (most recent call last):
File "/mnt/hgfs/MCLS/postprocessing/surface3d_demo2.py", line 6, in <module>
ax = fig.add_subplot(111, projection=''3d'')
File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.x-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 958, in add_subplot
a = subplot_class_factory(projection_class)(self, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.x-py2.7-linux-x86_64.egg/matplotlib/axes/_subplots.py", line 78, in __init__
self._axes_class.__init__(self, fig, self.figbox, **kwargs)
File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 78, in __init__
*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.x-py2.7-linux-x86_64.egg/matplotlib/axes/_base.py", line 436, in __init__
self.cla()
File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 847, in cla
Axes.cla(self)
File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.4.x-py2.7-linux-x86_64.egg/matplotlib/axes/_base.py", line 897, in cla
self.grid(self._gridOn, which=rcParams[''axes.grid.which''])
File "/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py", line 1057, in grid
self._draw_grid = maxes._string_to_bool(b)
AttributeError: ''module'' object has no attribute ''_string_to_bool''
El error se origina desde: ax = fig.add_subplot (111, projection = ''3d'')
Intenté verificar y actualizar matplotlib. Ejecutando python -c ''import matplotlib; print matplotlib.__version__''
python -c ''import matplotlib; print matplotlib.__version__''
me dio 1.4.x
Me sumergí en el código subyacente y encontré esto:
def grid(self, b=True, **kwargs):
''''''
Set / unset 3D grid.
.. note::
Currently, this function does not behave the same as
:meth:`matplotlib.axes.Axes.grid`, but it is intended to
eventually support that behavior.
.. versionchanged :: 1.1.0
This function was changed, but not tested. Please report any bugs.
''''''
# TODO: Operate on each axes separately
if len(kwargs) :
b = True
self._draw_grid = maxes._string_to_bool(b)
¿Alguien puede darme una sugerencia para ir más lejos?
Edit: he encontrado una solución para este problema. Como se puede ver en el último mensaje de error, algo salió mal en la función _string_to_bool
. Simplemente añada la siguiente línea
from matplotlib.cbook import _string_to_bool
encima de
/usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d/axes3d.py
Todavía recibo un mensaje de error, pero al menos me sale algo.
En mi caso, estaba importando marinos y pandas junto con Axes3D . La importación de mares y pandas después de Axes3D eliminó el error.
Para mí, (Ubuntu 14.04, usando el sistema Python), el problema se resolvió eliminando el paquete apt python-matplotlib
(solicitado por este informe de error ). Un matplotlib más nuevo también se instaló en / usr por pip; Creo que algunos paquetes pip más nuevos estaban obteniendo módulos de los paquetes apt más antiguos.
Esto fue después de probar el comando pip install --upgrade --ignore-installed matplotlib[mplot3d]
meyerson pip install --upgrade --ignore-installed matplotlib[mplot3d]
, que resultó en la recompilación de NumPy (y, supongo, la reinstalación de Matplotlib), pero no resolvió el problema.
También es interesante tener en cuenta que solo tuve el problema al ejecutar el script en cuestión (un lote de pruebas de unidad) en la línea de comandos, pero no cuando se ejecuta en el corredor de prueba LiClipse (que utiliza un orden PYTHONPATH diferente, explícitamente modificable. I lamento no intenté cambiar este orden para ver si podía reproducir el problema en Eclipse.
Para mí, la respuesta de iamaziz no funcionó, y el problema ocurre en Ubuntu 14.04 al usar virtualenv con --system-site-packages y matplotlib, pandas instalados a través de pip. Encontré que moviendo la línea
from mpl_toolkits.mplot3d import Axes3D
Antes de que la importación de pandas resuelva el problema.
Pude hacer que las cosas funcionen en OS X 10.10.2 utilizando una solución muy similar a las publicadas aquí. Ninguna de las soluciones específicas publicadas aquí funcionó en mi caso, pero me pusieron en el camino correcto para resolver el problema. Todas las cosas de mplot3d funcionaban en mi caja de Linux, no en mi mac. Yo uso homebrew en el lado de OS X. Recibía errores en cbook, específicamente el error _string_to_bool. Se hicieron llamadas en cbook.py, axes3d.py y axes.py. Todo lo que hice para solucionar el problema fue rastrear los archivos axes3d.py, axes.py y cbook.py en mi caja de Linux, y reemplazar esos archivos en mi máquina OS X, después de eso todo funcionó perfectamente y pude usar mplot3. Homebrew usa muchos enlaces simbólicos, así que ten cuidado, me gusta hacer una copia de seguridad de los archivos originales y reemplazarlos allí, no a nivel de enlace. Brew también puede dispersar los archivos un poco, aquí es donde estaban en mi máquina:
/Library/Python/2.7/site-packages/matplotlib-override/matplotlib/axes.py
/usr/local/Cellar/matplotlib/1.4.2/lib/python2.7/site-packages/mpl_toolkits/mplot3d/axes3d.py
/usr/local/Cellar/matplotlib/1.4.2/lib/python2.7/site-packages/matplotlib/cbook.py
en el lado de Linux (enlaces simbólicos desde /usr/lib/pymodules/python2.7): /usr/share/pyshared/matplotlib/axes.py
/usr/share/pyshared/matplotlib/cbook.py
/usr/share/pyshared/mpl_toolkits/mplot3d/axes3d.py
Simplemente haga una copia de seguridad, sustitúyalo por los archivos de su caja de Linux y pruébelo, funcionó para mí.
Si no tiene una versión que se ejecute en Linux, es posible que pueda extraer axes.py, axes3d.py y cbook.py de github, que tiene archivos mat.pplpllibs .py publicados.
Tuve el problema exacto, aquí es cómo lo resolví (en mi caso):
1) renombrar (o eliminar) la carpeta mplot3d
(por lo que matplotlib
cree que no está allí):
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/mpl_toolkits/mplot3d-old
2) actualizar matplotlib
con especifi cando mplot3d:
pip install --upgrade matplotlib[mplot3d]