Matplotlib条形图错误-TypeError:只能将大小为1的数组转换为Python标量
假设我有以下数据帧:Matplotlib条形图错误-TypeError:只能将大小为1的数组转换为Python标量,python,matplotlib,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], ['201
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
从中,函数期望高度参数为标量或标量序列。pandas.DataFrame.values是一个二维数组,第一维是行,第二维是列,即使只有一列,它也是一个二维数组,所以它是一个数组序列。因此,如果使用df.values,还需要将其重塑为预期的序列,即一维标量数组,即df.values.restrapelendf
或者,特别是在您的代码中:ax.bardf_Year.index、df_Year.values.reformelendf_Year
结果:
从中,函数期望高度参数为标量或标量序列。pandas.DataFrame.values是一个二维数组,第一维是行,第二维是列,即使只有一列,它也是一个二维数组,所以它是一个数组序列。因此,如果使用df.values,还需要将其重塑为预期的序列,即一维标量数组,即df.values.restrapelendf
或者,特别是在您的代码中:ax.bardf_Year.index、df_Year.values.reformelendf_Year
结果:
您也可以在以下wat中使用熊猫的名称:
df_Year.plot.bar()
plt.show()
这将产生:
您也可以在以下wat中使用熊猫的名称:
df_Year.plot.bar()
plt.show()
这将产生:
请不要将代码/数据/错误消息作为图像发布。将文本直接发布在SO上。请不要将代码/数据/错误消息作为图像发布。直接在此处发布文本。是的,它可以正常工作,无需重塑,因为在groupby和总和聚合之后的df_Year实际上是一个系列,而不是一个数据帧,这意味着一旦通过df_Year.values获得其值,您得到的是一维数组,而不是之前得到的二维数组。是的,它可以正常工作,无需重塑,因为在groupby和sum聚合之后的df_Year实际上是一个pandas系列,而不是一个DataFrame,这意味着一旦您通过df_Year.values获得其值,得到的是一维数组,而不是以前得到的二维数组