matplotlib将选定的图例项设为invisib

2024-04-20 13:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在for循环中绘制两条线,这两条线都有一个标签,在一个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()

Tags: inimportforlabelsasnp情况条目
1条回答
网友
1楼 · 发布于 2024-04-20 13:23:18

谢谢你的例子。在

像这样的事情呢:

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来“擦除”label中的行(您在白色背景上有白线),并使用空字符串作为标签。在

正常曲线图:

enter image description here

无(即空假人)第二个标签的绘图:

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

相关问题 更多 >