Как разместить график Matplotlib в окне Tkinter в Python

В этом уроке вы узнаете, как отобразить график из библиотеки Matplotlib в приложении Tkinter в Python.

Отображение столбчатой диаграммы из matplotlib в приложениях Tkinter

Matplotlib — сторонняя библиотека для создания профессиональных визуализаций на Python. Поскольку Matplotlib — сторонняя библиотека, перед использованием ее необходимо установить.

Чтобы установить пакет matplotlib, вы можете использовать следующую команду pip:

pip install matplotlib

Следующая программа использует matplotlib для создания столбчатой диаграммы, показывающей пять самых популярных языков программирования.

import tkinter as tk
import matplotlib

matplotlib.use('TkAgg')

from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import(
    FigureCanvasTkAgg,
    NavigationToolbar2Tk
)


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Tkinter Matplotlib Demo')

        # prepare data
        data = {
            'Python': 11.27,
            'C': 11.16,
            'Java': 10.46,
            'C++': 7.5,
            'C#': 5.26
        }
        languages = data.keys()
        popularity = data.values()

        # create a figure
        figure = Figure(figsize=(6, 4), dpi=100)

        # create FigureCanvasTkAgg object
        figure_canvas = FigureCanvasTkAgg(figure, self)

        # create the toolbar
        NavigationToolbar2Tk(figure_canvas, self)

        # create axes
        axes = figure.add_subplot()

        # create the barchart
        axes.bar(languages, popularity)
        axes.set_title('Top 5 Programming Languages')
        axes.set_ylabel('Popularity')

        figure_canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)


if __name__ == '__main__':
    app = App()
    app.mainloop()

Выход:

Пример диаграммы Tkinter Matplotlib

Как это работает.

  • Сначала импортируем модуль matplotlib
import matplotlib

и вызовем функцию use(), чтобы указать, какой бэкэнд будет использовать matplotlib:

matplotlib.use('TkAgg')

В данном случае мы используем бэкэнд TkAgg, который создан для интеграции в Tkinter.

  • Во-вторых, импортируем следующие классы Figure, FigureCanvasTkAgg и NavigationToolbar2Tk:
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import(
    FigureCanvasTkAgg,
    NavigationToolbar2Tk
)
  1. Класс Figure представляет область рисования, на которой будут отображаться диаграммы matplotlib.
  2. Класс FigureCanvasTkAgg представляет собой интерфейс между Figure и Tkinter Canvas.
  3. NavigationToolbar2Tk — это встроенная панель инструментов для фигуры на графике.
  • В-третьих, подготовьте данные для отображения на гистограмме:
data = {
    'Python': 11.27,
    'C': 11.16,
    'Java': 10.46,
    'C++': 7.5,
    'C#': 5.26
}
languages = data.keys()
popularity = data.values()

Данные представляют собой словарь, в котором ключи — языки программирования, а значения — их популярность в процентах.

  • В-четвертых, создадим Figure для размещения диаграммы:
figure = Figure(figsize=(6, 4), dpi=100)

Объект Figure принимает два аргумента: размер в дюймах и количество точек на дюйм(dpi). В этом примере он создает фигуру размером 600×400 пикселей.

  • В-пятых, создайте объект FigureCanvasTkAgg, который свяжет объект Figure с объектом Canvas Tkinter:
figure_canvas = FigureCanvasTkAgg(figure, self)

Обратите внимание, что объект FigureCanvasTkAgg не является объектом Canvas, но содержит объект Canvas.

  • В-шестых, создайте встроенную панель инструментов matplotlib:
NavigationToolbar2Tk(figure_canvas, self)
  • В-седьмых, добавьте к рисунку подграфик и верните оси подграфика:
axes = figure.add_subplot()
  • Восьмое, создайте столбчатую диаграмму, вызвав метод bar() осей и передав в него языки и популярность. Также задайте заголовок и метку оси Y:
axes.bar(languages, popularity)
axes.set_title('Top 5 Programming Languages')
axes.set_ylabel('Popularity')
  • Наконец, поместите диаграмму в корневое окно Tkinter:
figure_canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *