Python 3.x Matplotlib axes.legend更改图像大小(图像方向?)
这个问题很可能与我在重构链接的某些代码(以重用matplotlib Axis对象)时遇到的上一个问题有关。该问题描述了使用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来修复它,这是我的第一个想法,因为它看起来似乎正在以某种方式进行调整。我也无法通过找到的底层文档找到任何东西 以下是说明问题的图片(模糊的图例条目): 预期行为(图例条目数量有限) 意外行为(大量图例条目) 下面列
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
?