2016-07-13 15 views
1

Ich möchte Pandas Histogramm auf eine Achse zeichnen, aber das Verhalten ist wirklich seltsam. Ich weiß nicht, was hier los ist.Python & Pandas: Seltsames Verhalten, wenn Pandas Histogramm zu einer bestimmten Axt plotten

fig1, ax1 = plt.subplots(figsize=(4,3)) 
fig2, ax2 = plt.subplots(figsize=(4,3)) 
fig3, ax3 = plt.subplots(figsize=(4,3)) 

# 1. This works 
df['speed'].hist() 

# 2. This doens't work 
df['speed'].hist(ax=ax2) 

# 3. This works 
data = [1,2,3,5,6,2,3,4] 
temp_df = pd.DataFrame(data) 
temp_df.hist(ax=ax2) 

Die Fehler jupyter Notebook wieder ist:


AssertionError       Traceback (most recent call last) 
<ipython-input-46-d629de832772> in <module>() 
     7 
     8 # This doens't work 
----> 9 df['speed'].hist(ax=ax2) 
    10 
    11 # # This works 

D:\Anaconda2\lib\site-packages\pandas\tools\plotting.pyc in hist_series(self, by, ax, grid, xlabelsize, xrot, ylabelsize, yrot, figsize, bins, **kwds) 
    2953    ax = fig.gca() 
    2954   elif ax.get_figure() != fig: 
-> 2955    raise AssertionError('passed axis not bound to passed figure') 
    2956   values = self.dropna().values 
    2957 

AssertionError: passed axis not bound to passed figure 

Der Quellcode Pandas ist hier:

https://github.com/pydata/pandas/blob/d38ee272f3060cb884f21f9f7d212efc5f7656a8/pandas/tools/plotting.py#L2913

total keine Ahnung, was mit meinem Code falsch ist.

Antwort

4

Das Problem ist, dass Pandas bestimmt, welche die aktive Figur ist, indem Sie gcf() verwenden, um die "aktuelle Zahl" zu erhalten. Wenn Sie mehrere Figuren in einer Reihe erstellen, ist die "aktuelle Figur" die letzte, die erstellt wurde. Aber Sie versuchen, zu einem früheren zu plotten, was eine Diskrepanz verursacht.

Wie Sie jedoch in Zeile 2954 der Quelle, mit der Sie verlinkt sind, sehen können, sucht pandas nach einem (undokumentierten) figure Argument. So können Sie es tun, indem Sie df['speed'].hist(ax=ax2, figure=fig2) tun. Ein Kommentar in der Quelle pandas merkt an, dass dies ein "Hack ist, bis die Plot-Schnittstelle ein bisschen einheitlicher ist", so würde ich mich nicht auf etwas zu Kritisches verlassen.

Die andere Lösung besteht darin, keine neue Figur zu erstellen, bis Sie sie verwenden können. In Ihrem obigen Beispiel verwenden Sie nur Abbildung 2, so dass die anderen nicht erstellt werden müssen. Natürlich, das ist ein konstruiertes Beispiel, aber in einer Situation wirklichen Leben, wenn Sie Code wie dieses:

fig1, ax1 = plt.subplots(figsize=(4,3)) 
fig2, ax2 = plt.subplots(figsize=(4,3)) 
fig3, ax3 = plt.subplots(figsize=(4,3)) 

something.hist(ax=ax1) 
something.hist(ax=ax2) 
something.hist(ax=ax3) 

Sie können es, dies ändern:

fig1, ax1 = plt.subplots(figsize=(4,3)) 
something.hist(ax=ax1) 

fig2, ax2 = plt.subplots(figsize=(4,3)) 
something.hist(ax=ax2) 

fig3, ax3 = plt.subplots(figsize=(4,3)) 
something.hist(ax=ax3) 

Das heißt, setzen sich Abschnitt des Zeichencodes direkt nach dem Code, der die Figur für dieses Diagramm erstellt.

+0

Auch ich bin auf dieses Problem gestoßen, aber ich habe die Antwort nicht gut verstanden: _pandas bestimmt, welche die aktive Figur ist_ Im zweiten Fall zeigte der Typ 'ax = ax2' aber warum ist das nicht genug? In dem Fall, dass Sie eine einfache "Plot", und nicht "Hist", und es funktioniert. Warum gibt es einen Unterschied zwischen diesen beiden Funktionen? Thnaks – SPS

+1

@SPS: Warum? Ich weiß es nicht. Der Hack, der das undokumentierte "figure" -Argument verwendet, scheint nur in "hist" zu existieren. Warum das ist, weiß ich nicht. – BrenBarn

Verwandte Themen