Pandas: ValueError-Plot-Balkendiagramm aus DataFrame mit vorhandenen Achsen

Erstellt am 24. Aug. 2016  ·  3Kommentare  ·  Quelle: pandas-dev/pandas

Codebeispiel, wenn möglich ein kopierfähiges Beispiel

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

Erwartete Ausgabe

Ich würde erwarten, dass der zweite Plot in diesem Beispiel identisch mit dem ersten Plot funktioniert.

Ausgabe von 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

)

Usage Question

Hilfreichster Kommentar

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?

Alle 3 Kommentare

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!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen