Pandas: ValueError trazando el gráfico de barras de DataFrame con ejes existentes

Creado en 24 ago. 2016  ·  3Comentarios  ·  Fuente: pandas-dev/pandas

Ejemplo de código, un ejemplo que se puede copiar, si es posible

El siguiente código funciona, y cuando se pega en un Jupyter Notebook o una consola QT produce el gráfico de barras esperado:

%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt

# Create some data to plot
df = pd.DataFrame(
        dict(Feature1=[10, 20, 30, 20, 10], Feature2=[3, 2, 3, 2, 3]),
        index=['a', 'b', 'c', 'd', 'e']
)
_ = df.plot(kind='bar', legend=False, y='Feature1', yerr='Feature2', rot=0)

Sin embargo, tan pronto como trato de proporcionar una instancia Axes (para que el gráfico se coloque donde quiero), arroja un error. Ejecutar el siguiente código después del ejemplo anterior arroja un error:

fig = plt.figure(0)
ax = fig.add_subplot(111)
_ = df.plot(kind='bar', legend=False, y='Feature1', yerr='Feature2', rot=0, axes=ax)

Aquí está el rastreo:

Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
  File "/usr/local/miniconda3/lib/python3.5/site-packages/pandas/tools/plotting.py", line 3740, in __call__
    sort_columns=sort_columns, **kwds)
  File "/usr/local/miniconda3/lib/python3.5/site-packages/pandas/tools/plotting.py", line 2614, in plot_frame
    **kwds)
  File "/usr/local/miniconda3/lib/python3.5/site-packages/pandas/tools/plotting.py", line 2441, in _plot
    plot_obj.generate()
  File "/usr/local/miniconda3/lib/python3.5/site-packages/pandas/tools/plotting.py", line 1028, in generate
    self._make_plot()
  File "/usr/local/miniconda3/lib/python3.5/site-packages/pandas/tools/plotting.py", line 1971, in _make_plot
    log=self.log, **kwds)
  File "/usr/local/miniconda3/lib/python3.5/site-packages/pandas/tools/plotting.py", line 1918, in _plot
    return ax.bar(x, y, w, bottom=start, log=log, **kwds)
  File "/usr/local/miniconda3/lib/python3.5/site-packages/matplotlib/__init__.py", line 1812, in inner
    return func(ax, *args, **kwargs)
  File "/usr/local/miniconda3/lib/python3.5/site-packages/matplotlib/axes/_axes.py", line 2134, in bar
    self.add_patch(r)
  File "/usr/local/miniconda3/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 1780, in add_patch
    self._set_artist_props(p)
  File "/usr/local/miniconda3/lib/python3.5/site-packages/matplotlib/axes/_base.py", line 865, in _set_artist_props
    a.axes = self
  File "/usr/local/miniconda3/lib/python3.5/site-packages/matplotlib/artist.py", line 237, in axes
    raise ValueError("Can not reset the axes.  You are "
ValueError: Can not reset the axes.  You are probably trying to re-use an artist in more than one Axes which is not supported

Rendimiento esperado

Esperaría que la segunda trama funcione de manera idéntica a la primera trama en este ejemplo.

salida de pd.show_versions()

INSTALLED VERSIONS
------------------
commit: None
python: 3.5.2.final.0
python-bits: 64
OS: Linux
OS-release: 4.4.6-gentoo
machine: x86_64
processor: Intel(R) Core(TM) i3-3240 CPU @ 3.40GHz
byteorder: little
LC_ALL: None
LANG: en_US.utf8

pandas: 0.18.1
nose: 1.3.7
pip: 8.1.2
setuptools: 25.1.6
Cython: None
numpy: 1.11.1
scipy: 0.18.0
statsmodels: 0.6.1
xarray: None
IPython: 5.1.0
sphinx: 1.4.1
patsy: 0.4.1
dateutil: 2.5.3
pytz: 2016.6.1
blosc: None
bottleneck: None
tables: 3.2.3.1
numexpr: 2.6.1
matplotlib: 1.5.1
openpyxl: None
xlrd: 1.0.0
xlwt: None
xlsxwriter: None
lxml: None
bs4: None
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.13
pymysql: None
psycopg2: 2.6.1 (dt dec pq3 ext)
jinja2: 2.8
boto: None
pandas_datareader: None

(FWIW, acabo de construir y probar la última versión de pandas y obtuve el mismo comportamiento:

pandas: 0.18.1+391.g6645b2b

)

Usage Question

Comentario más útil

Quiere usar ax=ax , no axes .

Desafortunadamente, no creo que podamos hacer mucho para detectar este tipo de errores. Aceptamos **kwargs en los métodos .plot y los pasamos al método matplotlib subyacente (por ejemplo, .ax.bar ). No estoy muy seguro de por qué matplotlib axes.bar acepta una palabra clave axes , presumiblemente por compatibilidad con la interfaz de pylab.

Todos 3 comentarios

Quiere usar ax=ax , no axes .

Desafortunadamente, no creo que podamos hacer mucho para detectar este tipo de errores. Aceptamos **kwargs en los métodos .plot y los pasamos al método matplotlib subyacente (por ejemplo, .ax.bar ). No estoy muy seguro de por qué matplotlib axes.bar acepta una palabra clave axes , presumiblemente por compatibilidad con la interfaz de pylab.

Voy a cerrar esto por ahora; potencialmente podríamos aceptar axes como un alias para ax (no estoy seguro de por qué se eligió originalmente ax ), pero diría que espere por ahora y vea si más personas corren dentro de esto.

Ack. ¡Gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones