Python 图例中的标记类型错误

Python 图例中的标记类型错误,python,matplotlib,Python,Matplotlib,我试图创建一个简单的绘图,包含4组数据,4个列表绘制如下: for x,y in d1: p1 = plt.plot(x,y, 'bo') for x,y in d14: p2 = plt.plot(x,y, 'rs') for x,y in d56: p3 = plt.plot(x,y, 'gx') for x,y in d146: p4 = plt.plot(x,y, 'kD') plt.legend(['1', '14', '56', '146'], loc

我试图创建一个简单的绘图,包含4组数据,4个列表绘制如下:

for x,y in d1:
    p1 = plt.plot(x,y, 'bo')
for x,y in d14:
    p2 = plt.plot(x,y, 'rs')
for x,y in d56:
    p3 = plt.plot(x,y, 'gx')
for x,y in d146:
    p4 = plt.plot(x,y, 'kD')
plt.legend(['1', '14', '56', '146'], loc='upper left',numpoints = 1)
plt.show()
这给了我这样一个情节:

您可以看到图例中的标记错误,我尝试使用图例处理程序设置图例:

plt.legend([p1, p2, p3, p4], ["1", "14", "56", "146"], loc="upper left")
这将绘制图形,没有图例,告诉我使用代理艺术家,因为我的标签对象不受支持。如有任何帮助,将不胜感激。

编辑:

我发现您绘制单个点的方式存在问题。正在尝试使用zip:

In [1]: arr = [(0, 0), (1, 2), (2, 4), (3, 6), (4, 8)]
In [2]: zip(*arr)
Out[2]: [(0, 1, 2, 3, 4), (0, 2, 4, 6, 8)]
这样,你就可以做到

x, y = zip(*d1)
plt.plot(x, y, 'bo', label='d1')
x, y = zip(*d14)
plt.plot(x, y, 'rs', label='d14')
x, y = zip(*d56)
plt.plot(x, y, 'gx', label='d56')
x, y = zip(*d146)
plt.plot(x, y, 'kD', label='d146')
plt.legend()
而不是对循环使用


调用
plt.plot
时,尝试使用
label
关键字标记每个绘图:

In [1]: import numpy as np
In [2]: import matplotlib.pyplot as plt
In [3]: x1 = np.arange(5)
In [4]: y1, y2, y3, y4 = np.arange(5), np.arange(0, 10, 2), np.arange(0, 2.5, 0.5), np.random.rand(5)
In [5]: plt.plot(x1, y1, 'bo', label='1')
In [6]: plt.plot(x1, y2, 'rs', label='2')
In [7]: plt.plot(x1, y3, 'gx', label='3')
In [8]: plt.plot(x1, y4, 'kD', label='4')
In [9]: plt.legend()
Out[9]: <matplotlib.legend.Legend at 0x2b5aed0>
In [10]: plt.show()
[1]中的
:将numpy作为np导入
在[2]中:将matplotlib.pyplot作为plt导入
在[3]中:x1=np.arange(5)
在[4]中:y1,y2,y3,y4=np.arange(5),np.arange(0,10,2),np.arange(0,2.5,0.5),np.rand(5)
[5]中:plt.图(x1,y1,'bo',label='1')
[6]中:plt.图(x1,y2,'rs',label='2')
[7]中:plt.图(x1,y3,'gx',label='3')
[8]中:plt.plot(x1,y4,'kD',label='4')
在[9]:plt.legend()中
出[9]:
In[10]:plt.show()

第一次尝试失败,因为您在每个循环中多次调用plot命令,所以前四个plot都是蓝色标记。第二次尝试失败,因为
plt.plot
返回艺术家列表。您可以通过添加

p1, = plt.plot(x,y, 'kD')

而不是

p1 = plt.plot(x,y, 'kD')

注意for循环中的

,您正在覆盖变量。请注意,这也是代码示例中的图例仅生成蓝色标记的原因:您的前四个绘图调用可能在第一个for-loop中。顺便说一句,您确定需要循环吗?您的第二种方法不起作用,因为plot命令返回艺术家列表,而legend只需要artistI尝试过的艺术家列表,但由于我循环遍历了这些值,它为每个点创建了一个标签,有没有办法只指定一个标签?您需要
p1,=plot(…)
来解包list@tcaswell这是真的,尽管代码从未实际使用过
p1,…
,所以我刚刚删除了它们。
p1 = plt.plot(x,y, 'kD')