matplotlib使选定的图例条目不可见

时间:2015-01-06 01:02:27

标签: python matplotlib legend

我想绘制两条线,两条线都有一个标签,在for循环中多次产生几个图。在其中一些我希望图例中包含两个行条目,在某些只有第一行的句柄和标签,将第二行的条目留空。在所有情况下,我需要图例框架具有完全相同的大小,在我不想要第二个条目的情况下留下空白。

理论上我只需要转动第二个手柄并标签不可见。我发现一些解决方案Rectangle()Circle()虚拟条目设置为不可见。但是,它们与实际图例条目的大小不同,导致不同的图例框架高度,具体取决于我是使用图例中的两条线还是仅使用一条线和虚拟线。有解决方案吗?

这是一个接近它的样子的例子(当然,尽管产生了价值)。比方说,在每第二次迭代中,我需要较低的图例条目消失,而图例框架不会改变其大小或形状。我怎么能这样做?

import numpy as np
import matplotlib.pyplot as plt

for i in range(10):
    x1 = x2 = y1 = y2 = np.random.rand(5)
    yerr1 = yerr2 = .1

    plt.figure()
    plt.errorbar(x1, y1, yerr=yerr1, c='r', ls='-', marker='.', label='set1')
    plt.errorbar(x2, y2, yerr=yerr2, c='k', ls='-', marker='.', label='set2')

    # Get rid of error bars in legend
    ax.gca()
    handles, labels = ax.get_legend_handles_labels()
    handles = [n[0:1] for n in handles]

    plt.legend(handles, labels, bbox_to_anchor=(0.,1.,1.,0.), loc=3, numpoints=2, ncol=1 ,borderaxespad=0., mode='expand', labelspacing=0.5, borderpad=0.2, handletextpad=0.05)
    plt.savefig('test_%d' % i)
    plt.close()

1 个答案:

答案 0 :(得分:1)

谢谢你的例子。

这样的事情:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.lines as mlines

dummy_white_line = mlines.Line2D([], [], color='white')

for i in range(10):
    x1 = x2 = y1 = y2 = np.random.rand(5)
    yerr1 = yerr2 = .1

    plt.figure()
    plt.errorbar(x1, y1, yerr=yerr1, c='r', ls='-', marker='.', label='set1')
    plt.errorbar(x2, y2, yerr=yerr2, c='k', ls='-', marker='.', label='set2')

    # Get rid of error bars in legend
    ax = plt.gca()
    handles, labels = ax.get_legend_handles_labels()

    if i % 2 == 0:

        handles[1] = dummy_white_line
        labels[1]  = ''

    plt.legend(handles, labels, bbox_to_anchor=(0.,1.,1.,0.), 
                loc=3, numpoints=2, ncol=1 ,borderaxespad=0.,
                 mode='expand', labelspacing=0.5, borderpad=0.2, handletextpad=0.05)
    plt.savefig('test_%d' % i)
    #plt.show()
    plt.close()

在这里,我使用dummy_white_line来“擦除”标签中的线条(白色背景上有白线),并使用空字符串作为标签。

正常情节:

enter image description here

没有(即空虚)第二个标签:

file:///home/marcin/workspace2/mypython/test/test_2.png