python:带有重复传奇的情节

时间:2017-02-02 10:10:59

标签: python matplotlib legend

我要绘制3个文件(pos_Felix,pos_Iando,pos_Fabiotto)。出于某种原因,我必须将它们放在一个独特的文件中。可重现的代码如下:

from matplotlib import pylab
import numpy

pos_Felix = numpy.array([ [  3.05150657e-01,  -7.33839341e-01],
                        [  3.24785115e-01,  -5.70699171e-01],
                        [ -1.90952119e-02,  -9.31596157e-01],
                        [  1.01292710e+00,  -3.75807265e-01],
                        [  3.32793456e-01,  -6.54133767e-01]])

pos_Iando = numpy.array([ [  3.41211808e-04,  -1.43754261e-02],
                        [ -1.18384581e-01,  -4.84193704e-01]])

pos_Fabiotto = numpy.array([ [ -4.63776141e-01,   1.62560557e+00]])

pos_all = numpy.concatenate([pos_Felix,pos_Iando,pos_Fabiotto],axis=0)


myColors = ['green']*pos_Felix.shape[0] + ['red']*(pos_Iando.shape[0]+pos_Fabiotto.shape[0])

myShapes    =   ['.']*pos_Felix.shape[0]     + ['^']*pos_Iando.shape[0]       + ['*']*pos_Fabiotto.shape[0]
myLabels    =   ['Felix']*pos_Felix.shape[0] + ['Iando']*pos_Iando.shape[0]   + ['Fabiotto']*pos_Fabiotto.shape[0]



pylab.figure()
pylab.title("Multi Dimensional Scaling")
pylab.xlabel("X")
pylab.ylabel("Y")
for i in range(pos_all.shape[0]):
    pylab.plot(pos_all[i,0],pos_all[i,1],myShapes[i], color=myColors[i], label=myLabels[i])
pylab.legend(loc="upper left")

pylab.show()

简而言之,我必须绘制一系列点(我确信" for"构造不是最好的,但至少它起作用到目前为止),每个都有一个点颜色,每个属于一个类别(" Felix"," Iando"和#34; Fabiotto"),每个都有它的标记。除了图例外,图表还可以。它的长度为8而不是3.我得到以下图像(红色是我要删除的):

enter image description here

我相信有一个快速解决我的问题的方法......但我不知道哪一个! ps =我知道我可以在正确的位置创建一个只有3个元素的图例列表和#34;无"对于其他人,但在我的实际案例中,我有很长的名单,我需要一个自动程序。

2 个答案:

答案 0 :(得分:1)

因为您似乎可以访问每个名称的各个数组,所以您只需生成3个图,每个名称一个。

pylab.figure()
pylab.title("Multi Dimensional Scaling")
pylab.xlabel("X")
pylab.ylabel("Y")

pylab.plot(pos_Felix[:,0],pos_Felix[:,1],".", color="green", label="Felix")
pylab.plot(pos_Iando[:,0],pos_Iando[:,1],"^", color="red", label="Iando")
pylab.plot(pos_Fabiotto[:,0],pos_Fabiotto[:,1],"*", color="red", label="Fabiotto")

pylab.legend(loc="upper left")

pylab.show()

答案 1 :(得分:0)

如果所有重复标签都是连续的,这应该有效:

pylab.figure()
pylab.title("Multi Dimensional Scaling")
pylab.xlabel("X")
pylab.ylabel("Y")
last_label = None
for i in range(pos_all.shape[0]):
    label = myLabels[i]
    if label == last_label:
        label = None
    else:
        last_label = label
    pylab.plot(pos_all[i,0],pos_all[i,1],myShapes[i], color=myColors[i], label=label)
pylab.legend(loc="upper left")

pylab.show()

您还可以创建一个包含{label:style}的字典并保留已标记的图表列表,以确保每个具有相同名称的数据集都具有相同的样式,并且仅在尚未标记的情况下进行标记({ {1}}代替if label in list_labels)。