Python/Matplotlib - wxPython中的图形边框

3 投票
1 回答
1754 浏览
提问于 2025-04-16 18:00

我在一个wxpython面板上有一个matplotlib的图形。我的应用程序是实时运行的,用户可以调整窗口的大小。不过,当用户调整窗口大小时,我的坐标轴周围的边框就会变得不太对劲。

我知道可以用fig.subplots_adjust这个函数来调整边框,但这个函数里的值是百分比,所以当窗口最大化时,边框周围会有很多浪费的空间,而当窗口比较小的时候,空间刚好合适。

有没有类似的函数,可以让我用像像素这样的单位来指定边框,这样无论窗口大小如何,边框的宽度都能保持一致呢?

一如既往,感谢大家!

1 个回答

6

这里有一个例子,展示了如何实现这个功能。代码定义了一个函数,这个函数会根据当前图形的大小,把像素边框的值转换成百分比。同时,它还连接了一个事件监听器,当图形大小改变时,会自动调整边框的大小:

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()

撰写回答