【问题标题】:python: plot with a repeated legendpython:带有重复图例的情节
【发布时间】:2017-02-02 10:10:59
【问题描述】:

我有 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”和“Fabiotto”),每个类别都有其标记。图表没问题,除了图例。它的长度是 8 而不是 3。我得到以下图像(我想删除的红色):

我确信有一种快速的方法可以解决我的问题……但我不知道是哪一种! ps= 我知道我可以创建一个图例列表,其中只有 3 个元素在正确的位置,其他元素为“无”,但在我的实际情况下,我的列表很长,我需要一个自动化程序。

【问题讨论】:

  • 由于您对颜色和名称进行了硬编码,因此您也可以对图例条目进行硬编码。此示例无法扩展到具有“非常长”列表的“真实案例”。可能的答案需要知道你如何在“真实案例”中做数据与标签、颜色和形状之间的映射。
  • 我试着让它更通用。

标签: python matplotlib legend


【解决方案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()

【讨论】:

    【解决方案2】:

    如果所有重复的标签都是连续的,这应该可以工作:

    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} 制作字典并保留已标记图的列表,以确保具有相同名称的每个数据集都具有相同的样式,并且仅在尚未标记时才被标记(if label in list_labels而不是label == last_label)。

    【讨论】:

    • 是的,最后我用类似的方法解决了。谢谢!
    猜你喜欢
    • 2021-02-08
    • 2021-11-08
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2021-11-03
    • 2020-07-17
    • 2021-03-17
    相关资源
    最近更新 更多