问题
I have a DataFrame with categorical index like so:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib notebook
accidents_by_day=pd.DataFrame({'num_accidents':[5659,5298,4917,4461,4181,4038,3985],
'weekday':[7,1,6,5,4,2,3]})
weekday_map={1:'Sunday',2:'Monday',3:'Tuesday',4:'Wednesday',5:'Thursday',6:'Friday',7:'Saturday'}
new_index=(pd.CategoricalIndex(accidents_by_day.weekday.map(weekday_map)).
reorder_categories(new_categories=['Monday','Tuesday','Wednesday','Thursday',
'Friday','Saturday','Sunday'],
ordered=True))
accidents_by_day.set_index(new_index,drop=True,inplace=True)
accidents_by_day.sort_index(inplace=True)
While The following works fine:
accidents_by_day.num_accidents.plot(kind='bar')
The plt.plot(accidents_by_day.num_accidents)
gives an error
~\Anaconda3\lib\site-packages\matplotlib\axes\_base.py in _plot_args(self, tup, kwargs)
390 func = self._makefill
391
--> 392 ncx, ncy = x.shape[1], y.shape[1]
393 for j in xrange(max(ncx, ncy)):
394 seg = func(x[:, j % ncx], y[:, j % ncy], kw, kwargs)
IndexError: tuple index out of range
and plt.plot([accidents_by_day.num_accidents])
produces an empty figure.
Could anyone explain what is happening here?
Thanks!
回答1:
plt.plot
takes two arguments, x
and y
: plt.plot(x,y)
. If you only specify a single argument, plt.plot(y)
, it is assumed that you want to plot against the numbers 0, ..., len(y)-1
. So what is possible here, is to plot
plt.plot(accidents_by_day.num_accidents.values)
The produced plot might however not be the desired one, since the dataframe index is not taken into account.
So you may stick to the usual plt.plot(x,y)
and supply the index,
plt.plot(accidents_by_day.index.categories, accidents_by_day.num_accidents.values)
来源:https://stackoverflow.com/questions/48835096/plt-plot-issue-in-pandas-with-categorical-index-dataframe