【问题标题】:How to replace matplotlib legend and keep same location?如何替换 matplotlib 图例并保持相同的位置?
【发布时间】:2017-09-02 03:49:50
【问题描述】:

我想用一个新的图例替换一个 matplotlib 图例,但要保持被替换图例的相同(可能是任意的)位置。

为什么下面的代码不起作用?

将 matplotlib.pyplot 导入为 plt plt.plot(范围(10)) 斧头 = plt.gca() leg = plt.legend(['a'], loc='左下') bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes) plt.legend(['b'], bbox_to_anchor=bb)

【问题讨论】:

    标签: python matplotlib location legend


    【解决方案1】:

    回答问题中的代码为什么不起作用的问题:
    图例的位置仅在绘制图形时在运行时确定。此外,未设置 bbox_to_anchor,因此它将是完整的轴 ((0,0,1,1))。

    可以先绘制画布,再获取窗口范围

    ax.figure.canvas.draw()
    bb = leg.get_window_extent().inverse_transformed(ax.transAxes)
    

    然而,这不会给你正确的位置(只是靠近它)。

    现在一个可能的解决方案可能不是替换图例,而是只更新它的内容:

    import matplotlib.pyplot as plt
    
    plt.plot(range(10))
    ax = plt.gca()
    
    leg = plt.legend(['a'], loc='lower left')
    
    leg.texts[0].set_text("b")
    
    plt.show()
    

    否则,如果更新不是一个选项,您将需要旧图例中的 bbox_to_anchor 和 loc 参数:

    import matplotlib.pyplot as plt
    
    plt.plot(range(10))
    ax = plt.gca()
    
    leg = plt.legend(['a'], loc='lower left', bbox_to_anchor=(0.5,0.5))
    
    bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes)
    plt.legend(['b'], bbox_to_anchor=bb, loc=leg._loc_real) 
    
    plt.show()
    

    在模式已设置为“扩展”的情况下,这可能仍会失败。只有在使用相同的 fancybox 参数来创建新图例时,它也是准确的。

    【讨论】:

    • 更新内容就好了。但是,我认为不可能更新我需要的所有属性:fontsize、numpoints、scatterpoints、labelspacing、handletextpad、borderaxespad、borderpad、handlelength 和 fancybox。我认为其中一些只能通过创建时的 legend 命令访问。
    • 有没有办法确定图例的锚定方式/位置?例如,图例的左下角锚定到轴的左下角。如果是这样,那么我可以设置loc='lower left'...
    • 我更新了答案。也许这更接近您的需要。
    • _loc_real 正是我所需要的!你知道_loc_real_loc有什么区别吗?
    • 一个比另一个更真实。 ;-) 不,老实说,我现在不知道。
    【解决方案2】:

    除非我有误解,否则就这样做:

    import matplotlib.pyplot as plt
    
    plt.plot(range(10))
    ax = plt.gca()
    
    location = 'lower left'
    
    while 1:
    
        plt.legend(['a'], loc=location)
        plt.pause(1)
        plt.legend(['b'], loc=location)
        plt.pause(1)
    

    【讨论】:

    • 我应该澄清原始图例位置未知,除了可能是任意的。例如,如果图形是从 pickle 文件加载的,就会发生这种情况。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多