Matplotlib: переменный размер подзаговоров?

У меня есть проект, в котором я рисую и сохраняю рисунки с помощью matplotlib. Поскольку сам проект работал отлично, я недавно начал рефакторинг, но есть одна проблема, для которой я пока не нашел хорошего решения. Чтобы разделить реализацию и ведение журнала, я написал класс ведения журнала, который передает данные классу построения, и тут у меня возникла проблема: до выполнения я не знаю, сколько подграфиков будет существовать в одном графике/рисунке журнала.

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

Раньше у меня было что-то вроде этого (здесь: для 4 сюжетных линий):

f, axarr = plt.subplots(2, 2)

axarr[0, 0].set_title("original image")
axarr[0, 0].imshow(oimg, interpolation="none", cmap="gray")

axarr[0, 1].set_title("cost data") 
axarr[0, 1].plot(cost_data, ...)
(...)

Конечно, я мог бы создать около 6 различных методов, подобных этому, в моем классе построения графиков для 1, 2, 3, ... подграфиков, но тогда у меня снова будет повторение.

Могу ли я как-то создать буфер и динамически добавить подзаголовок в цикл или что-то в этом роде?

Любые другие идеи?


person daniel451    schedule 21.02.2016    source источник
comment
Напишите функции построения графиков, которые принимают Axes объект + данные в качестве входных данных. Относительно легко писать циклы for по подсюжетам + ваш список данных.   -  person tacaswell    schedule 21.02.2016
comment
Да, но я хотел бы, чтобы метод построения графика динамически создавал объект осей, чтобы класс построения графика принимал любой размер ввода и создавал точное количество подграфиков для ввода. Если бы мне пришлось вводить объект осей, мне пришлось бы делать plt.subplots(2, 2) вручную с фиксированным размером везде, где я хочу отображать данные?!   -  person daniel451    schedule 21.02.2016
comment
Разделите логику, один набор функций, которые отображают данные в один Axes, и одну функцию диспетчера, которая принимает ваши данные + параметры + конфигурацию + что угодно, создает фигуру + оси, а затем отправляет их ранее упомянутым функциям. Таким образом, вы получите максимальное повторное использование кода (и удобочитаемость!).   -  person tacaswell    schedule 21.02.2016
comment
И вы можете динамически изменять размер Axes объектов, но нет встроенных инструментов.   -  person tacaswell    schedule 21.02.2016
comment
Не могли бы вы привести пример? Может быть, для меня уже слишком поздно, и я должен идти спать, но я не могу придумать правильного решения для функции диспетчера.   -  person daniel451    schedule 21.02.2016