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