Matplotlib / Pandas-Fehler unter Verwendung des Histogramms

73

Ich habe ein Problem beim Erstellen von Histogrammen aus Objekten der Pandas-Serie und kann nicht verstehen, warum dies nicht funktioniert. Der Code hat vorher gut funktioniert, aber jetzt nicht mehr.

Hier ist ein Teil meines Codes (insbesondere ein Objekt der Pandas-Serie, von dem ich ein Histogramm erstellen möchte):

type(dfj2_MARKET1['VSPD2_perc'])

welches das Ergebnis ausgibt: pandas.core.series.Series

Hier ist mein Plotcode:

fig, axes = plt.subplots(1, 7, figsize=(30,4))
axes[0].hist(dfj2_MARKET1['VSPD1_perc'],alpha=0.9, color='blue')
axes[0].grid(True)
axes[0].set_title(MARKET1 + '  5-40 km / h')

Fehlermeldung:

    AttributeError                            Traceback (most recent call last)
    <ipython-input-75-3810c361db30> in <module>()
      1 fig, axes = plt.subplots(1, 7, figsize=(30,4))
      2 
    ----> 3 axes[1].hist(dfj2_MARKET1['VSPD2_perc'],alpha=0.9, color='blue')
      4 axes[1].grid(True)
      5 axes[1].set_xlabel('Time spent [%]')

    C:\Python27\lib\site-packages\matplotlib\axes.pyc in hist(self, x, bins, range, normed,          weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label,    stacked, **kwargs)
   8322             # this will automatically overwrite bins,
   8323             # so that each histogram uses the same bins
-> 8324             m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs)
   8325             m = m.astype(float) # causes problems later if it's an int
   8326             if mlast is None:

    C:\Python27\lib\site-packages\numpy\lib\function_base.pyc in histogram(a, bins, range,     normed, weights, density)
    158         if (mn > mx):
    159             raise AttributeError(
--> 160                 'max must be larger than min in range parameter.')
    161 
    162     if not iterable(bins):

AttributeError: max must be larger than min in range parameter.
Jonas
quelle
Hmm, es funktioniert bei mir. Können Sie Ihren Datenrahmen anzeigen?
Andrey Shokhin
Hmm, seltsam, wenn ich das mache, kann ich tatsächlich ein Histogramm erstellen: s = dfj2_MARKET1 ['VSPD1_perc'] s.hist ()
jonas
Ja, aber dann verwenden Sie die Pandas- histFunktion und keine Matplotlibs. Und dies behandelt zB NaNs wie erwartet. Siehe mein Update.
Joris

Antworten:

127

Dieser Fehler tritt unter anderem auf, wenn Sie NaN-Werte in der Serie haben. Könnte das der Fall sein?

Diese histNaNs werden von der Funktion von Matplotlib nicht gut gehandhabt. Zum Beispiel:

s = pd.Series([1,2,3,2,2,3,5,2,3,2,np.nan])
fig, ax = plt.subplots()
ax.hist(s, alpha=0.9, color='blue')

erzeugt den gleichen Fehler AttributeError: max must be larger than min in range parameter.Eine Option besteht z. B. darin, die NaNs vor dem Plotten zu entfernen. Das wird funktionieren:

ax.hist(s.dropna(), alpha=0.9, color='blue')

Eine andere Möglichkeit besteht darin, die Pandas- histMethode für Ihre Serie zu verwenden und axes[0]das axSchlüsselwort anzugeben:

dfj2_MARKET1['VSPD1_perc'].hist(ax=axes[0], alpha=0.9, color='blue')
Joris
quelle
3

Der Fehler ist zu Recht auf die NaNoben erläuterten Werte zurückzuführen. Benutz einfach:

df = df['column_name'].apply(pd.to_numeric)

Wenn der Wert nicht numerisch ist, gilt Folgendes:

df = df['column_name'].replace(np.nan, your_value)
Brainhack
quelle