假设我有以下DataFrame:
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime as dt
df = pd.DataFrame(
[
['2008-02-19', 10],
['2008-03-01', 15],
['2009-02-05', 20],
['2009-05-10', 40],
['2010-10-10', 25],
['2010-11-15', 5]
],
columns = ['Date', 'DollarTotal']
)
df
我想绘制按年总计的总数,因此执行以下转换:
df['Date'] = pd.to_datetime(df['Date'])
df_Year = df.groupby(df['Date'].dt.year)
df_Year = df_Year.sum('DollarTotal')
df_Year
matplotlib中的以下代码创建以下图表:
fig,ax = plt.subplots()
ax.plot(df_Year.index, df_Year.values)
ax.set_xlabel("OrderYear")
ax.set_ylabel("$ Total")
ax.set_title("Annual Purchase Amount")
plt.xticks([x for x in df_Year.index], rotation=0)
plt.show()
该问题时,我想创建一个发生条形图使用相同的数据帧。通过将上面的代码从更改ax.plot
为ax.bar
,我得到以下错误:
在matplotlib中进行绘图之前,我从未遇到过此错误。我做错了什么?
请参阅下面由dm2解决的问题的答案。
编辑:
我只是想出了为什么我以前从未遇到过这个问题。这与我如何总结groupby
。如果我替换为df_Year = df_Year.sum('DollarTotal')
,df_Year = df_Year['DollarTotal'].sum()
则不会发生此问题。
df = pd.DataFrame(
[
['2008-02-19', 10],
['2008-03-01', 15],
['2009-02-05', 20],
['2009-05-10', 40],
['2010-10-10', 25],
['2010-11-15', 5]
],
columns = ['Date', 'DollarTotal']
)
df['Date'] = pd.to_datetime(df['Date'])
df_Year = df.groupby(df['Date'].dt.year)
df_Year = df_Year['DollarTotal'].sum()
df_Year
fig,ax = plt.subplots()
ax.bar(df_Year.index, df_Year.values)
ax.set_xlabel("OrderYear")
ax.set_ylabel("$ Total")
ax.set_title("Annual Purchase Amount")
plt.xticks([x for x in df_Year.index], rotation=0)
plt.show()
从matplotlib.axes.Axes.bar文档中,该函数期望height参数为标量或标量序列。pandas.DataFrame.values
是一个二维数组,它的第一维是行,第二维是列(即使只有一列,它也是一个二维数组),所以它是一个数组序列。因此,如果使用df.values
,则还需要将其调整为标量(即df.values.reshape(len(df))
)的预期序列(即一维数组)。
或者,特别是在您的代码中:ax.bar(df_Year.index, df_Year.values.reshape(len(df_Year))
。
结果:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句