python matplotlib:为stackplot添加标签并正确设置其颜色

python matplotlib:为stackplot添加标签并正确设置其颜色,python,matplotlib,Python,Matplotlib,我正在创建一个堆叠的绘图。我从自己的实验和在线研究中了解到,将标签添加到堆叠的绘图中是一件麻烦的事情,但我已经成功地用下面的代码实现了这一点 我的问题是:如何检索用于创建堆叠图的颜色循环,以便为图例指定正确的颜色 现在字段1为蓝色,字段2为绿色,但两个标签都以第一种颜色显示。我可以强制特定颜色的情节和图例,但我很喜欢默认的颜色周期,并希望继续使用它 df=pd.DataFrame(np.ones((10,2)),columns=['field1','field2']) fig,ax=plt.su

我正在创建一个堆叠的绘图。我从自己的实验和在线研究中了解到,将标签添加到堆叠的绘图中是一件麻烦的事情,但我已经成功地用下面的代码实现了这一点

我的问题是:如何检索用于创建堆叠图的颜色循环,以便为图例指定正确的颜色

现在字段1为蓝色,字段2为绿色,但两个标签都以第一种颜色显示。我可以强制特定颜色的情节和图例,但我很喜欢默认的颜色周期,并希望继续使用它

df=pd.DataFrame(np.ones((10,2)),columns=['field1','field2'])
fig,ax=plt.subplots()
plt.suptitle('This is a plot of ABCDEF')
ax.stackplot(df.index,df.field1,df.field2]
patch1=matplotlib.patches.Patch(color='red',label= 'field 1')
patch2=matplotlib.patches.Patch(color='blue', label ='field 2')
plt.legend(handles=[patch1,patch2])
我找到的最接近的解决方案是:但是,如果我理解正确,颜色的顺序就不会被保留。问题是

ax._get_lines.color_cycle
返回一个迭代器,而不是一个列表,因此我无法轻松地执行以下操作

colour of patch 1 = ax._get_lines.color_cycle[0]

谢谢

您可以从stackplot生成的polycollection对象获取颜色:

fields = ax.stackplot(df.index,df.field1,df.field2)
colors = [field.get_facecolor()[0] for field in fields]
patch1=mpl.patches.Patch(color=colors[0],label= 'field 1')
patch2=mpl.patches.Patch(color=colors[1], label ='field 2')

你不能从迭代器中创建列表的任何原因,比如:
list(ax.\u get\u lines.color\u cycle)
,我不知道为什么,但它不起作用。我试着运行它,python似乎被卡住了:超过1分钟后,仍然什么都没有。它可能与matplotlib的许多未记录或记录不良的功能之一有关。如果有人能解释为什么它不工作,我会非常感兴趣。实际上,尝试colors=list(ax.\u get\u lines.color\u cycle)会使整个IDE(Spyder)崩溃3次,我不知道为什么。。。