Matplotlib 条形图错误 - TypeError:只有大小为 1 的数组可以转换为 Python 标量

Iam*_*her 2 python matplotlib

假设我有以下数据帧:

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
Run Code Online (Sandbox Code Playgroud)

df

我想绘制按年份求和的总数,因此我执行以下转换:

df['Date'] = pd.to_datetime(df['Date'])
df_Year = df.groupby(df['Date'].dt.year)
df_Year = df_Year.sum('DollarTotal')
df_Year
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

阴谋

问题时,我想创建一个发生条形图使用相同的数据帧。通过将上面的代码从 更改ax.plotax.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
Run Code Online (Sandbox Code Playgroud)

df_sum

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()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

dm2*_*dm2 6

matplotlib.axes.Axes.bar 文档中,该函数期望高度参数为标量或标量序列。pandas.DataFrame.values是一个二维数组,行作为第一维,列作为第二维(即使只有一列,它也是一个二维数组),所以它是一个数组序列。因此,如果使用df.values,还需要将其重塑为预期的标量序列(即一维数组)(即df.values.reshape(len(df)))。

或者,特别是在你的代码:ax.bar(df_Year.index, df_Year.values.reshape(len(df_Year))

结果:

在此处输入图片说明