Matplotlib issue match # of values to # of labels -- ValueError: 'label' must be of length 'x'

Matplotlib issue match # of values to # of labels -- ValueError: 'label' must be of length 'x'

我有一个名为 high 的 df,它看起来像这样:

   white  black  asian  native  NH_PI  latin
0  10239  26907   1079     670     80   1101`

我正在尝试使用 matplotlib 创建一个简单的饼图。我查看了多个示例和其他 SO 页面,例如 ,但我不断收到此错误:

Traceback (most recent call last):
  File "I:\Sustainability & Resilience\Food Policy\Interns\Lara Haase\data_exploration.py", line 62, in <module>
    plt.pie(sizes, explode=None, labels = high.columns, autopct='%1.1f%%', shadow=True, startangle=140)
  File "C:\Python27\ArcGIS10.6\lib\site-packages\matplotlib\pyplot.py", line 3136, in pie
    frame=frame, data=data)
  File "C:\Python27\ArcGIS10.6\lib\site-packages\matplotlib\__init__.py", line 1819, in inner
    return func(ax, *args, **kwargs)
  File "C:\Python27\ArcGIS10.6\lib\site-packages\matplotlib\axes\_axes.py", line 2517, in pie
    raise ValueError("'label' must be of length 'x'")
ValueError: 'label' must be of length 'x'`

我尝试了多种不同的方法来确保标签和值匹配。每个都有 6 个,但我不明白为什么 Python 不同意我的看法。

这是我试过的一种方法:

plt.pie(high.values, explode=None, labels = high.columns, autopct='%1.1f%%', shadow=True, startangle=140)

另一种方式:

labels = list(high.columns)
sizes = list(high.values)
plt.pie(sizes, explode=None, labels = labels, autopct='%1.1f%%', shadow=True, startangle=140)`

也尝试过 .iloc:

labels = list(high.columns)
sizes = high.loc[[0]]
print(labels)
print(sizes)
plt.pie(sizes, explode=None, labels = labels, autopct='%1.1f%%', shadow=True, startangle=140)

但无论我尝试过什么,我总是遇到同样的关键错误。有什么想法吗?

你可以试试这个,使用 pandas 数据帧图:

df.T.plot.pie(y=0, autopct='%1.1f%%', shadow=True, startangle=140, figsize=(10,8), legend=False)

输出:

只是为了扩展@ScottBoston 的post,

除非将数据重塑为单列或系列,否则不可能从单行数据框中绘制饼图。

我通常使用的操作是.stack()

df = df.stack()

.stack().T 非常相似,但是returns 是一个以列名作为第二索引级别的系列。当您有多行并希望保留原始索引时,这很方便。 df.stack() 的结果是:

0  white     10239
   black     26907
   asian      1079
   native      670
   NH_PI        80
   latin      1101
dtype: int64

在我 stack() 一个数据框之后,我通常使用以下方式为系列指定一个名称:

df.name = 'Race'

设置名称不是必需的,但在您实际尝试使用 pd.DataFrame.plot.pie.

绘制数据时会有所帮助

如果数据框 df 有多于一行数据,您可以使用 .groupby

为每一行绘制饼图
for name, group in df.groupby(level=0):
    group.index = group.index.droplevel(0)
    group.plot.pie(autopct='%1.1f%%', shadow=True, startangle=140)

由于索引的第一层仅提供输入数据的位置索引,我删除该层以使绘图上的标签按需要显示。

如果您不想使用 pandas 制作饼图,这对我有用:

plt.pie(df.squeeze().values, labels=df.columns.tolist(),autopct='%1.1f%%', shadow=True, startangle=140)

此尝试没有成功,因为 high.columns 不是列表式的。

#attempt 1
plt.pie(high.values, explode=None, labels = high.columns, autopct='%1.1f%%', shadow=True, startangle=140)

此尝试没有成功,因为 list(high.values) returns 一个以数组作为第一个元素的列表。

#attempt 2
labels = list(high.columns)
sizes = list(high.values)
plt.pie(sizes, explode=None, labels = labels, autopct='%1.1f%%', shadow=True, startangle=140)

最后一次尝试失败,因为 high.loc[[0]] returns 数据帧。 Matplotlib 不知道将数据帧解析为输入。

labels = list(high.columns)
sizes = high.loc[[0]]
print(labels)
print(sizes)
plt.pie(sizes, explode=None, labels = labels, autopct='%1.1f%%', shadow=True, startangle=140)