отображение pandas данных в окне tkinter - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь построить pandas фрейм данных в окне tkinter. В основном то, что я пытаюсь выполнить sh: когда пользователь нажимает кнопку графика, в окне tkinter появляется график с указанием лет и значений. Но по какой-то странной причине я получаю ошибку атрибута AttributeError: 'AxesSubplot' object has no attribute 'set_canvas' ' Есть идеи, почему это происходит?

файл plotting.py:

import matplotlib
import pandas as pd
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

fig, ax = plt.subplots()


def plotGraph(self):
   data2 = {'Year': [1920, 1930, 1940, 1950, 1960, 1970, 1980, 1990, 2000, 2010],
         'Value': [9.8, 12, 8, 7.2, 6.9, 7, 6.5, 6.2, 5.5, 6.3]
         }
   df2 = pd.DataFrame(data2, columns=['Year', 'Value'])
   df2 = df2[['Year', 'Value']].groupby('Year').sum()

   yLabelText = "Value"
   ax.set_xlabel('Years')
   ax.set_ylabel(yLabelText)

   fig = plt.figure(figsize=(12, 10), dpi=80)
   ax1 = fig.add_subplot(111)
   datas = df2.plot(ax=ax1,color ='orange')
   ax.get_yaxis().set_major_formatter(matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))
   fig.tight_layout()
   canvas = FigureCanvasTkAgg(datas, self)
   canvas.show()
canvas.get_tk_widget().pack(side=self.BOTTOM, fill=self.BOTH, expand=True)

и файл основного интерфейса:

try:
    import Tkinter as tk
except:
    import tkinter as tk

import plotting as pyt


class GetInterfaceValues():
    def __init__(self):
        self.root = tk.Tk()
        self.totalValue = tk.StringVar()

        self.root.geometry('500x200')

        self.plotGraphButton = tk.Button(self.root, text='plot the kegs values', command=self.plot)

        self.plotGraphButton.pack()

        self.root.mainloop()



    def plot(self):
        pyt.plotGraph(self.root)




app = GetInterfaceValues()

1 Ответ

1 голос
/ 27 апреля 2020

Вы передали не тот объект FigureCanvasTkAgg.

Настройка FigureCanvasTkAgg(figure, master=None, resize_callback=None), поэтому вам нужно передать fig вместо data, например так:

def plotGraph(self):
    ...
    canvas = FigureCanvasTkAgg(fig, self)
    canvas.draw()
    canvas.get_tk_widget().pack(side="bottom", fill="both", expand=True)

Также вы должны использовать Figure вместо pyplot при объединении tkinter с matplotlib. См. this для образца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...