Я пишу программное обеспечение для сокращения данных массовых спецификаций на 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'. Что я делаю не так?
Заранее спасибо!






Все могло бы быть менее запутанным, если бы вы использовали более стандартные соглашения об именах.
from matplotlib.figure import Figure
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.
Я добавил скриншот того, что я получаю. Можете ли вы уточнить, это не то, что вы видите, или не то, что вы хотите?
Я вижу разницу. Вы используете fig = Figure(figsize=(15,9), layout='tight'), тогда как я использовал fig = Figure(figsize=(15,9)) и fig.layout = 'tight'. По какой-то причине ваш метод работает, а мой нет. Но да, это дает мне макет, который я ищу, спасибо!
Что касается заголовка, я был идиотом и пытался вызвать его
Figure, модуль, а неfigure, объект, так что это решено. Однако макет по-прежнему слишком тесный, независимо от того, какие параметры макета я устанавливаю.