我在wxpython面板的画布上有一个matplotlib图。我的应用程序是实时运行的,用户可以重新调整窗口框架的大小。然而,当发生这种情况时,我的轴周围的边界就会失控。
我知道我可以使用函数fig.subplots_adjust来调整边框,但是函数中指定的值是百分比,因此当最大化时,边框周围会浪费一些TON空间,即使空间恰到好处窗口较小。
有没有类似于这个功能的东西,我可以在像素这样的东西中指定边框,这样无论框架的大小是多少,边框都是相同的宽度?
一如既往,谢谢!
答案 0 :(得分:5)
这是一个如何做到这一点的例子。该代码定义了一个函数,该函数根据当前图形大小将像素边界值转换为百分比。它还连接了一个事件监听器,它将在调整图形大小时调整边框:
import numpy
import matplotlib.pyplot as plt
def adjust_borders(fig, targets):
"Translate desired pixel sizes into percentages based on figure size."
dpi = fig.get_dpi()
width, height = [float(v * dpi) for v in fig.get_size_inches()]
conversions = {
'top': lambda v: 1.0 - (v / height),
'bottom': lambda v: v / height,
'right': lambda v: 1.0 - (v / width),
'left': lambda v: v / width,
'hspace': lambda v: v / height,
'wspace': lambda v: v / width,
}
opts = dict((k, conversions[k](v)) for k, v in targets.items())
fig.subplots_adjust(**opts)
fig = plt.figure(figsize=(7, 5))
for i in range(4):
ax = fig.add_subplot(2, 2, i+1)
ax.plot([1,2,3], [4,5,1])
ax.set_xticks([])
ax.set_yticks([])
# target sizes in pixels.
targets = dict(left=10, right=10, top=10, bottom=30, hspace=30, wspace=30)
# hook up a function to adjust the borders when the window is resized
fig.canvas.mpl_connect('resize_event', lambda e: adjust_borders(fig, targets))
adjust_borders(fig, targets)
plt.show()