Matplotlib axes.legend 更改图像大小(图像纵横比?)

Matplotlib axes.legend changes image size (image aspect?)

这个问题很可能与我之前在重构链接的一些代码(重新使用 matplotlib 轴对象)时出现的问题有关 。该问题描述了使用 imshow 会调整 image.aspect 参数的问题。

我现在遇到一个产生类似效果的问题,但我无法通过将 image.aspect 参数强制设置为自动来修复它,这是我的第一个想法,因为它看起来正在以某种方式进行调整.我也无法通过 here.

的基础文档挖掘任何内容

这里有 图片 说明问题(模糊的图例条目):

预期行为(图例条目数量有限)

意外行为(大量图例条目)

A MVCE 下面列出了上述行为(带有完全无意义的数据),其中可以通过切换上限在预期和意外(对我而言)之间切换行为在 for i in range(1,10): 行到 50.

from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg
)
import tkinter as tk
import numpy
from matplotlib import image, figure

class Foo(object):
    @classmethod
    def run(cls):
        root = tk.Tk()
        Foo(root)
        root.mainloop()

    def __init__(self, master):
        self.fig = figure.Figure(figsize=(12,6))
        self.fig.set_tight_layout(True)
        self.axes = self.fig.add_subplot(111)
        self.axes.axis('off')
        self.canvas = FigureCanvasTkAgg(self.fig, master=master)
        self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=tk.YES)
        self.canvas.draw()
        self.data = []
        # Adjust the upper value to 10 or 50
        for i in range(1,10):
            self.axes.plot(range(0,100),numpy.random.randint(1,100,100), label=str(i))
        self.axes.legend()


if __name__ == '__main__':
    Foo.run()

我很想得到关于这次我正在努力处理的参数或设置的提示。

这里 tight_layout 正在尝试以尽可能少的填充使绘制的每个艺术家都适合图形。当图例条目的数量非常大时,这会产生一些不希望的结果。

在 matplotlib 版本 > 3 中,艺术家有一个 属性 set_in_layout (docs for tight_layout),您可以将其设置为 True 或 False 以在计算时包含或忽略它tight_layout 被调用。因此,您可以修改 __init__ 使其看起来像:

def __init__(self, master):
    self.fig = figure.Figure(figsize=(12,6))
    self.fig.set_tight_layout(True)
    self.axes = self.fig.add_subplot(111)
    self.axes.axis('off')
    self.canvas = FigureCanvasTkAgg(self.fig, master=master)
    self.canvas.get_tk_widget().pack(fill=tk.BOTH, expand=tk.YES)
    self.canvas.draw()
    self.data = []
    # Adjust the upper value to 10 or 50
    for i in range(1,50):
        self.axes.plot(range(0,100),numpy.random.randint(1,100,100), label=str(i))
    self.leg = self.axes.legend()
    self.leg.set_in_layout(False)  # set to False so it's not used in tight_layout calculation!

另一种(但不太理想)选项是删除 self.fig.set_tight_layout(True) 并使用 self.fig.subplots_adjust() 自行调整空格,但这可能需要对参数进行一些手动调整才能获得所需的结果.