Python 2.7 类型错误:';路径集合';向绘图添加第二个图例时,对象不可编辑

Python 2.7 类型错误:';路径集合';向绘图添加第二个图例时,对象不可编辑,python-2.7,pandas,matplotlib,Python 2.7,Pandas,Matplotlib,我从三个独立的数据框中绘制散点图,并绘制点和最佳拟合线。我可以使用以下代码完成此操作: 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

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

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。我正试图这样做:

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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行文件('E:/prelim\u代码/Fire.py',wdir='E:/prelim\u代码')
文件“C:\Users\Stefano\Anaconda2\u 2\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py”,第714行,在runfile中
execfile(文件名、命名空间)
文件“C:\Users\Stefano\Anaconda2\u 2\lib\site packages\spyderlib\widgets\externalshell\sitecustomize.py”,第74行,在execfile中
exec(编译(脚本文本,文件名,'exec'),glob,loc)
文件“E:/prelim_代码/Fire.py”,第539行,在
scat1,=ax1.scatter(ex_x,ex_y,s=10,c='r',label='Fire Exclusion')
TypeError:“PathCollection”对象不可编辑

我也有同样的错误。我发现不应该在变量名后面加逗号。所以试试看

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')
这是因为返回的是PathCollection,而Axis.plot返回的是打印线的元组(请参见和)


因此,对于您的行,您仍然需要逗号,因为您正在解包元组,但是对于分散的行,您不应该使用逗号。

天哪,非常感谢您。我已经疯狂了30分钟,直到我看到你关于#$%@逗号的答案!