TypeError:将第二个图例添加到绘图时,"PathCollection"对象不可迭代 [英] TypeError: 'PathCollection' object is not iterable when adding second legend to plot

查看:1021
本文介绍了TypeError:将第二个图例添加到绘图时,"PathCollection"对象不可迭代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在从三个单独的数据框中绘制散点图,并绘制点和最佳拟合线.我可以使用以下代码完成此操作:

I am making a scatter plot from three separate dataframes and plotting the points as well as the best fit lines. I can accomplish this using this code:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

fig=plt.figure()
ax1=fig.add_subplot(111)
ax2=fig.add_subplot(111)
ax3=fig.add_subplot(111)

#create scatter plots from the dataframes
ax1.scatter(ex_x, ex_y, s=10, c='r', label='Fire Exclusion')
ax2.scatter(one_x,one_y, c='b', marker='s',label='One Fire')
ax3.scatter(two_x, two_y, s=10, c='g', marker='^', label='Two Fires')

#plot lines of best fit
ax1.plot(ex_x,ex_results.predict(), color = 'r',label = 'Linear (Fire Exclusion)')
ax2.plot(one_x,one_results.predict(), color = 'b',label = 'Linear (One Fire)')
ax3.plot(two_x,two_results.predict(), color = 'g',label = 'Linear (Two Fires)')

#add legend and axis labels
plt.xlabel('NDVI 2004/07/27')
plt.ylabel('NDVI 2005/07/14')
plt.title('NDVI in 2004 vs. 2005')
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), scatterpoints=1)

这给了我

现在,我想添加第二个图例,该图例将显示每行的r2.我正在尝试这样做:

Now I want to add a second legend which will display the r2 for each line. I am attempting to do that like this:

fig=plt.figure()
ax1=fig.add_subplot(111)
ax2=fig.add_subplot(111)
ax3=fig.add_subplot(111)

scat1,=ax1.scatter(ex_x, ex_y, s=10, c='r', label='Fire Exclusion')
scat2,=ax2.scatter(one_x,one_y, c='b', marker='s',label='One Fire')
scat3,=ax3.scatter(two_x, two_y, s=10, c='g', marker='^', label='Two Fires')

lin1,=ax1.plot(ex_x,ex_results.predict(), color = 'r',label = 'Linear (Fire Exclusion)')
lin2,=ax2.plot(one_x,one_results.predict(), color = 'b',label = 'Linear (One Fire)')
lin3,=ax3.plot(two_x,two_results.predict(), color = 'g',label = 'Linear (Two Fires)')

l1 = plt.legend([scat1, scat2,scat3,lin1,lin2,lin3], ["Fire Exclusion", "One Fire", "Two Fires", "Linear (Fire Exclusion)", "Linear (One Fire)", "Linear (Two Fires)"], loc='upper left', scatterpoints=1)

#get r2 from regression results
r2ex=ex_results.rsquared
r2one=one_results.rsquared
r2two=two_results.rsquared

plt.legend([r2ex, r2one, r2two], ['R2 (Fire Exclusion)', 'R2 (One Fire)', 'R2 (Two Fires)'], loc='lower right')

plt.gca().add_artist(l1)
plt.xlabel('NDVI 2004/07/27')
plt.ylabel('NDVI 2005/07/14')
plt.title('NDVI in 2004 vs. 2005')

但这返回:

Traceback (most recent call last):

  File "<ipython-input-32-b6277bf27ded>", line 1, in <module>
    runfile('E:/prelim_codes/Fire.py', wdir='E:/prelim_codes')

  File "C:\Users\Stefano\Anaconda2_2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 714, in runfile
    execfile(filename, namespace)

  File "C:\Users\Stefano\Anaconda2_2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "E:/prelim_codes/Fire.py", line 539, in <module>
    scat1,=ax1.scatter(ex_x, ex_y, s=10, c='r', label='Fire Exclusion')

TypeError: 'PathCollection' object is not iterable

推荐答案

我有相同的错误.我发现您不应该在变量名后添加逗号.所以尝试

I had the same error. I found out that you shouldn't include the comma after your variable names. So try

scat1 =ax1.scatter(ex_x, ex_y, s=10, c='r', label='Fire Exclusion')
scat2 =ax2.scatter(one_x,one_y, c='b', marker='s',label='One Fire')
scat3 =ax3.scatter(two_x, two_y, s=10, c='g', marker='^', label='Two Fires')

代替

scat1,=ax1.scatter(ex_x, ex_y, s=10, c='r', label='Fire Exclusion')
scat2,=ax2.scatter(one_x,one_y, c='b', marker='s',label='One Fire')
scat3,=ax3.scatter(two_x, two_y, s=10, c='g', marker='^', label='Two Fires')

这是因为 axes.scatter 返回与axes.plot不同的PathCollection,该PathCollection返回绘制的线的元组(请参见 http://matplotlib.org/1.3.1/users/pyplot_tutorial.html#controlling-line-properties

This is because axes.scatter returns a PathCollection unlike axes.plot which returns a tuple of the lines plotted (see http://matplotlib.org/1.3.1/users/pyplot_tutorial.html#controlling-line-properties and Python code. Is it comma operator?).

因此对于您的行,您仍然需要逗号,因为您要打开元组的包装,但对于散点图则不应该使用逗号.

So for your lines you will still need the comma because you are unpacking the tuple but for the scatter you should not have the comma.

这篇关于TypeError:将第二个图例添加到绘图时,"PathCollection"对象不可迭代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆