Генерация и сохранение в бэкграунде графиков matplotlib

15 000 руб. за проект
19 августа 2022, 10:21 • 5 откликов • 35 просмотров
Генерация и сохранение в бэкграунде графиков matplotlib

К заказу приложен тест (по ссылке ниже). Тест имитирует исходный проект. Отладить функцию генерации и сохранения графиков надо прямо в тесте.

В исходном проекте запускается экземпляр класса Main, а Main запускает несколько экземпляров класса Simulation. Экземпляры Simulation запускаются как отдельные процессы с помощью модуля threading. Экземпляры Simulation не обмениваются между собой данными, они независимы.

Экземпляры Simulation должны сохранять графики в виде растровых (PNG) и векторных (не выбрал пока формата) картинок. Отрисовка и сохранение картинок должно быть в бэкграунде. Для создания графиков выбран модуль matplotlib.

matplotlib отказывался работать в Simulation, с ошибкой - не может запускаться не из главного процесса. Видимо из-за того что Simulation запущен через threading. Для решения этой проблемы использовался код отсюда
Multiprocess — Matplotlib 3.5.3 documentation
Исходный код из этой ссылки немного упрощен, но ошибку (невозможно работать не в главном процессе) удалось решить. Но осталось много проблем.

Задачи которые нужно решить:
1. сохранение картинки в файл работает только когда включена отрисовка на экран пользователя (plt.show). В документации к matplotlib рекомендуют отрисовку в бэкграунд через matplotlib.use('Agg'), но при этом почему то закрывается pipe в multiprocessing. Применение matplotlib.use('Agg') я откатил и эта проблема не решена. Окно matplotlib не должно появлятся на экране пользователя.
2. В Simulation даётся команда на сохранение 8ми графиков. Но сохранятеся только 7 картинок. Видимо последняя картинка не сохраняется.
3. Сейчас графики накладываются друг на друга. Вторая, третья и т.д. сохраненная картинка показывает наложенными 1ый + 2ой график, 1ый + 2ой + 3ий графики и т.д. Нужно чтобы чтобы графики не накладывались.
4. Генерация и сохранение первого графика требует около 3 секунд, а каждого последующего - 1 секунду. Нужно уменьшить время до 0.1 сек. (вызов графика - сторока 92 "self.parameters['plotter'].send(data)")
5. Нужно переписать класс Plotter и добавить обработку входных числовых данных разными способами. А именно, чтобы генерировались графики с разным дизайном. Для этого можно в передаваемые данные добавить ключ "type" с возможными значениями ['type_1', 'type_2', 'type_3'] и далее в Plotter должно быть ветвление для генерации графиков разного дизайна.
6. В дизайн графиков добавить возможность задавать: заголовок, названия осей, диапазон значения осей, равный масштаб осей (данные отображают координаты облака точек и нужно чтобы не искажалась форма облака), легенда, форма точек, цвет точек, разрешения сохраняемой картинки, размер сохраняемой картинки, тип файла сохраняемой картинки - растровый (png).

Тестовую функцию и исходные данные, в которой нужно решить указанные проблемы, можно скачайть по ссылке https://1drv.ms/u/s!AgsliTwx9ZLRhNFF7z-TTJtETJiGhg...

Скриншот тестовой функции приложени к заказу.

Требования: Windows 10, Python 3.9
Срок - 1 неделя
Файлы
Отзывы
Общение с Раулем сразу получилось конструктивным, по делу, без воды. Работа сделана. Сделана в срок. Все необходимые пояснения от Рауля получил.
Рекомендую
~ 1 месяц назад
R50 1dc0c2bd85ff53cb8971ba80982ac762
Фрилансер
С заказчиком было приятно работать)
Был на связи, отвечал на все вопросы -- даже по мелочи, понятно объяснял детали задачи, содействовал на каждом этапе и быстро принял заказ.
Буду рад дальнейшему сотрудничеству)
~ 1 месяц назад