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)
我有一个名为 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)