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.

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')

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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.