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
Esperaría que la segunda trama funcione de manera idéntica a la primera trama en este ejemplo.
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
)
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!
Comentario más útil
Quiere usar
ax=ax
, noaxes
.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é matplotlibaxes.bar
acepta una palabra claveaxes
, presumiblemente por compatibilidad con la interfaz de pylab.