Python/Matplotlib — границы рисунков в wxPython

У меня есть рисунок matplotlib на холсте на панели wxpython. Мое приложение запускается в режиме реального времени, и пользователь может изменить размер рамки окна. Однако, когда это происходит, границы вокруг моих осей выходят из строя.

Я знаю, что могу использовать функцию fig.subplots_adjust для настройки границ, но значения, указанные в функции, являются процентами, поэтому при максимизации вокруг границ остается ТОННА неиспользуемого пространства, даже если пространство в самый раз, когда окно меньше.

Есть ли что-нибудь похожее на эту функцию, где я могу указать границу в чем-то вроде пикселей, чтобы граница была одинаковой ширины независимо от размера рамки?

Как всегда, Спасибо!


person Scott B    schedule 19.05.2011    source источник


Ответы (1)


Вот пример того, как это можно сделать. Код определяет функцию, которая переводит значения границ пикселей в проценты на основе текущего размера фигуры. Он также подключает прослушиватель событий, который будет регулировать границы при изменении размера фигуры:

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()
person samplebias    schedule 20.05.2011
comment
Потрясающе, спасибо. Надеялся, что есть встроенная функция, которая в основном сделает это за нас (похоже, это будет общий запрос?), но это тоже хорошо работает. - person Scott B; 20.05.2011
comment
Круто, рад, что полезно. Я согласен, что это должно быть встроено - когда я визуализирую график в формате PNG, проще установить размеры в пикселях, и необходимость пересчитывать проценты при изменении разрешения немного утомительна. - person samplebias; 20.05.2011