Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matplotlib条形图错误-TypeError:只能将大小为1的数组转换为Python标量_Python_Matplotlib - Fatal编程技术网

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获得其值,得到的是一维数组,而不是以前得到的二维数组