Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Matplotlib axes.legend更改图像大小(图像方向?)_Python 3.x_Matplotlib_Legend_Axes - Fatal编程技术网

Python 3.x Matplotlib axes.legend更改图像大小(图像方向?)

Python 3.x Matplotlib axes.legend更改图像大小(图像方向?),python-3.x,matplotlib,legend,axes,Python 3.x,Matplotlib,Legend,Axes,这个问题很可能与我在重构链接的某些代码(以重用matplotlib Axis对象)时遇到的上一个问题有关。该问题描述了使用imshow将调整image.aspect参数的问题 我现在遇到了一个问题,该问题会产生类似的效果,但我无法通过强制将image.aspect参数设置为auto来修复它,这是我的第一个想法,因为它看起来似乎正在以某种方式进行调整。我也无法通过找到的底层文档找到任何东西 以下是说明问题的图片(模糊的图例条目): 预期行为(图例条目数量有限) 意外行为(大量图例条目) 下面列

这个问题很可能与我在重构链接的某些代码(以重用matplotlib Axis对象)时遇到的上一个问题有关。该问题描述了使用
imshow
将调整
image.aspect
参数的问题

我现在遇到了一个问题,该问题会产生类似的效果,但我无法通过强制将
image.aspect
参数设置为auto来修复它,这是我的第一个想法,因为它看起来似乎正在以某种方式进行调整。我也无法通过找到的底层文档找到任何东西

以下是说明问题的图片(模糊的图例条目):

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

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

下面列出了上述行为(具有完全无意义的数据)的MVCE,通过将范围(1,10):行中i的
上限切换到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()

我很想得到一个提示,告诉我这次我在努力解决什么参数或设置。

这里的
紧密布局
试图让每一位画家都尽可能少地填充到人物中。当图例条目的数量非常大时,这将产生一些不希望的结果

在matplotlib versions>3中,艺术家有一个属性
set_In_layout
(),您可以将该属性设置为True或False,以便在调用
tight_layout
时将其包括在计算中或从计算中忽略。因此,您可以修改
\uuuu init\uuuu
使其看起来像:

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\u tight\u layout(True)
并使用,但是,这可能需要手动调整参数以获得所需的结果。

我认为这是由于添加了大量图例条目,当与
self.fig.set_tight_layout(True)
@DavidG一起使用时,这些图例条目会改变图形的布局,但是,如果可能的话,我想保持
fig.set_tight_layout
的行为,让图形填充整个画布(/Axes?)。一个不太理想的替代方法是删除
self.fig.set_tight_layout(True)
并使用确实可以工作的
self.fig.subplots_adjust()
@DavidG自己调整空白,因此,我对
set_tight_layout
确定图像(包括图例)的大小,并以某种方式单独调整图像的大小,以便组合在页面上以尽可能少的填充来匹配的理解正确吗?您使用的是什么版本的
matplotlib