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()
自行调整空格,但这可能需要对参数进行一些手动调整才能获得所需的结果.
这个问题很可能与我之前在重构链接的一些代码(重新使用 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()
自行调整空格,但这可能需要对参数进行一些手动调整才能获得所需的结果.