Der folgende Code funktioniert und ergibt beim Einfügen in ein Jupyter Notebook oder eine QT-Konsole das erwartete Balkendiagramm:
%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)
Sobald ich jedoch versuche, eine benutzerdefinierte Axes
-Instanz bereitzustellen (damit der Plot dort platziert wird, wo ich ihn haben möchte), wird ein Fehler ausgegeben. Das Ausführen des folgenden Codes nach dem obigen Beispiel löst einen Fehler aus:
fig = plt.figure(0)
ax = fig.add_subplot(111)
_ = df.plot(kind='bar', legend=False, y='Feature1', yerr='Feature2', rot=0, axes=ax)
Hier ist der Traceback:
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
Ich würde erwarten, dass der zweite Plot in diesem Beispiel identisch mit dem ersten Plot funktioniert.
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, ich habe gerade die neueste Version von Pandas gebaut und ausprobiert und habe das gleiche Verhalten erhalten:
pandas: 0.18.1+391.g6645b2b
)
Sie möchten ax=ax
, nicht axes
.
Leider glaube ich nicht, dass wir viel tun können, um diese Art von Fehlern zu erkennen. Wir akzeptieren **kwargs
in den .plot
-Methoden und geben sie an die zugrunde liegende matplotlib-Methode weiter (z. B. .ax.bar
). Ich bin nicht wirklich sicher , warum matplotlib axes.bar
akzeptiert einen axes
Schlüsselwort, vermutlich für die Kompatibilität mit der pylab - Schnittstelle?
Ich werde das jetzt schließen; Wir könnten möglicherweise axes
als Alias für ax
akzeptieren (nicht sicher, warum ax
ursprünglich ausgewählt wurde), aber ich würde sagen, halten Sie sich vorerst zurück und sehen Sie, ob mehr Leute laufen das sehr gut finden.
Bestätigen Sie. Vielen Dank!
Hilfreichster Kommentar
Sie möchten
ax=ax
, nichtaxes
.Leider glaube ich nicht, dass wir viel tun können, um diese Art von Fehlern zu erkennen. Wir akzeptieren
**kwargs
in den.plot
-Methoden und geben sie an die zugrunde liegende matplotlib-Methode weiter (z. B..ax.bar
). Ich bin nicht wirklich sicher , warum matplotlibaxes.bar
akzeptiert einenaxes
Schlüsselwort, vermutlich für die Kompatibilität mit der pylab - Schnittstelle?