Проблемы с макетом Matplotlib

Я пишу программное обеспечение для сокращения данных массовых спецификаций на Python v3.7.9 и использую matplotlib v3.5.3 для отображения данных.

Недавно я обнаружил, что использую неправильный модуль matplotlib.pyplot, который несовместим с tkinter. Сейчас я пытаюсь перейти на использование matplotlib.figure, которое совместимо (ссылка ).

Это вызвало пару проблем:

  • Макет теперь стал намного плотнее, из-за чего оси почти перекрываются, а вокруг графиков появляется масса пробелов.
  • Я не могу добавить заголовок (AttributeError: module 'matplotlib.figure' has no attribute 'suptitle'), хотя атрибут четко определен в документации matplotlib.

Вот несколько скриншотов до и после: первый использует matplotlib.pyplot с плотным макетом, а второй использует matplotlib.figure с параметром макета по умолчанию.

Ручная установка макета как «жесткого» или «ограниченного», по-видимому, вообще не имеет большого эффекта, равно как и оставление стиля макета неопределенным.

Есть ли способ восстановить предыдущий «расширенный» стиль макета без определения вручную множества параметров?

Вот пример скрипта для работы:

import customtkinter as ctk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

import matplotlib.figure as Figure

# create the window using CTK
window = ctk.CTk()

# create the plot of random data
figure = Figure.Figure(figsize=(15,9))
Figure.layout = 'tight'

# create the subplots
ax1 = figure.add_subplot(2, 3, 1)
ax2 = figure.add_subplot(2, 3, 2)
ax3 = figure.add_subplot(2, 3, 3)
ax4 = figure.add_subplot(2, 3, 4)
ax5 = figure.add_subplot(2, 3, 5)
ax6 = figure.add_subplot(2, 3, 6)

# plot data in each subplot
data = [1, 2, 3, 4, 5]
ax1.plot(data)
ax2.plot(data)
ax3.plot(data)
ax4.plot(data)
ax5.plot(data)
ax6.plot(data)

# add titles to each subplot
ax1.set_title('Subplot 1')
ax2.set_title('Subplot 2')
ax3.set_title('Subplot 3')
ax4.set_title('Subplot 4')
ax5.set_title('Subplot 5')
ax6.set_title('Subplot 6')

# Add the plot to the window
canvas = FigureCanvasTkAgg(figure, master=window)
canvas.draw()
canvas.get_tk_widget().pack(side='top', fill='both', expand=True)

exit_button = ctk.CTkButton(window, text='Exit', command=window.destroy)
exit_button.pack(side='bottom')  # add the exit button to the window

window.mainloop()

Наконец, как я уже упоминал выше, в документации matplotlib явно указан атрибут .suptitle(), однако добавление Figure.suptitle('Data') приводит к AttributeError: module 'matplotlib.figure' has no attribute 'suptitle'. Что я делаю не так?

Заранее спасибо!

Что касается заголовка, я был идиотом и пытался вызвать его Figure, модуль, а не figure, объект, так что это решено. Однако макет по-прежнему слишком тесный, независимо от того, какие параметры макета я устанавливаю.

ohshitgorillas 29.05.2024 20:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все могло бы быть менее запутанным, если бы вы использовали более стандартные соглашения об именах.

  1. В Python классы обычно пишутся с заглавной буквы, поэтому вместо переименования модуля с заглавной буквы я предлагаю импортировать класс из модуля.
from matplotlib.figure import Figure
  1. В Matplotlib конкретный экземпляр класса Figure часто называется fig.

Вы можете установить макет при создании экземпляра своей фигуры.

fig = Figure(figsize=(15,9), layout='tight')

suptitle — метод экземпляра фигуры

fig.suptitle('My Title')

Собираем это вместе:

import customtkinter as ctk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

from matplotlib.figure import Figure

# create the window using CTK
window = ctk.CTk()

# create the plot of random data
fig = Figure(figsize=(15,9), layout='tight')
fig.suptitle('My Title')

# create the subplots
ax1 = fig.add_subplot(2, 3, 1)
ax2 = fig.add_subplot(2, 3, 2)
ax3 = fig.add_subplot(2, 3, 3)
ax4 = fig.add_subplot(2, 3, 4)
ax5 = fig.add_subplot(2, 3, 5)
ax6 = fig.add_subplot(2, 3, 6)

# plot data in each subplot
data = [1, 2, 3, 4, 5]
ax1.plot(data)
ax2.plot(data)
ax3.plot(data)
ax4.plot(data)
ax5.plot(data)
ax6.plot(data)

# add titles to each subplot
ax1.set_title('Subplot 1')
ax2.set_title('Subplot 2')
ax3.set_title('Subplot 3')
ax4.set_title('Subplot 4')
ax5.set_title('Subplot 5')
ax6.set_title('Subplot 6')

# Add the plot to the window
canvas = FigureCanvasTkAgg(fig, master=window)
canvas.draw()
canvas.get_tk_widget().pack(side='top', fill='both', expand=True)

exit_button = ctk.CTkButton(window, text='Exit', command=window.destroy)
exit_button.pack(side='bottom')  # add the exit button to the window

window.mainloop()

Я понимаю это:

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

ohshitgorillas 29.05.2024 20:32

Я добавил скриншот того, что я получаю. Можете ли вы уточнить, это не то, что вы видите, или не то, что вы хотите?

RuthC 29.05.2024 20:36

Я вижу разницу. Вы используете fig = Figure(figsize=(15,9), layout='tight'), тогда как я использовал fig = Figure(figsize=(15,9)) и fig.layout = 'tight'. По какой-то причине ваш метод работает, а мой нет. Но да, это дает мне макет, который я ищу, спасибо!

ohshitgorillas 29.05.2024 20:41

Другие вопросы по теме

Похожие вопросы

Я попытался очистить веб-сайт с помощью Selenium Python и сохранить его в CSV, но он распечатал и дублировал только первый результат
Python Tkinter структурирован в класс: могут ли методы находиться в независимом файле?
Как исправить предупреждение Pydantic «Значение по умолчанию не является сериализуемым JSON» при использовании стороннего аннотированного типа? [несериализуемый-по умолчанию]
Убедитесь, что решение удовлетворяет PDE: FiPy
Ошибка AttributeError: объект «DataFrame» не имеет атрибута «append», попробовал pd.concat, но также вызвал ошибку
Ошибка типа при создании пользовательского набора данных с использованием набора данных HuggingFace
Существует ли в Python f-строка, эквивалентная std::quoted в C++?
Selenium — TypeError: невозможно создать экземпляр абстрактного класса Service без реализации абстрактного метода «command_line_args»
Поскольку запросы == 2.32.2 получили SSL/сертификат, проверка не удалась: самозаверяющий сертификат при использовании python-keycloak
Наименьший_квадрат неточен в химическом виде