Tkinter 不显示折线图

Tkinter don't display line chart

在 calc def 中,我想用 draw def 在 gui 上显示所有 for 循环(逐图显示),但只显示最后一个。我尝试了 2 种不同的方式,但其中 none 有效。我想问题是我给了他们 1 个位置,并且所有这些都显示在彼此顶部的那个位置上。我该如何解决?提前致谢。

from tkinter import *
from tkinter import messagebox

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends._backend_tk import NavigationToolbar2Tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from pandas import DataFrame
from decimal import *

root = Tk()
root.geometry('800x300')
root.title('PythonExamples.org - Tkinter Example')

global e1
global numm
global my_entry
my_entry= Entry(root)
e1=Entry(root)
e1.place(x=100,y=180)
korok=Entry(root)
korok.place(x=100,y=210)
entries=[]
entries2=[]
new_array=[]


def calc(numbers):
    n=int(korok.get())
    P=np.dot(numbers,numbers)
    for i in range(n):
        P=np.dot(P,numbers)
        draw(P)
        np.set_printoptions(precision=3)
        print(P)

    label = Label(root, text=str(P),font=("Arial", 15)).place(x=20, y=60)

def draw(data):
    fig,a = plt.subplots()
    df2 = DataFrame(data)
    figure2 = plt.Figure(figsize=(5, 5), dpi=50)
    ax2 = figure2.add_subplot(111)
    line3 = FigureCanvasTkAgg(figure2, root)
    line3.get_tk_widget().place(x=300,y=100)
    #line3.get_tk_widget().grid(row=5, column=5)
    df2.plot(kind='line', legend=True, ax=ax2, fontsize=10)
    plt.close(fig)
    ax2.set_title('Markov')
def create():
    numm = int(e1.get())
    global my_entry
    for x in range(numm):
        row = []
        for i in range(numm):
            my_entry = Entry(root)
            my_entry.grid(row=x, column=i)
            row.append(my_entry)
        entries.append(row)


def save():
    my_array = [[float(el.get()) for el in row] for row in entries]
    new_array = np.asarray(my_array)

    calc(new_array)


create = Button(root,text='Submit',command=create).place(x=40,y=180)
save = Button(root,text='Szamol',command=save).place(x=40,y=210)

my_label=Label(root,text='')
root.mainloop()

首先要理解的是matplotlib

figureaxes的概念

就像一个sheet,可以在上面画很多东西 plt.subplots 函数创建可以在图形上绘图的空间。

Axes 是您可以使用 X 和 Y

显示数据的地方

主要错误:在draw函数中,您每次都创建一个新图形,即每个图形都绘制在彼此之上。创建图形一次(在 calc 中)然后使用 draw 函数在不同的轴上绘制。

这里是我做的一些修改,适合你的程序

def calc(numbers):
    n=int(korok.get())
    P=np.dot(numbers,numbers)
    fig, a = plt.subplots(n, 1) # Create n row of 1 plot in fig
    for i in range(n):
        P=np.dot(P,numbers)
        draw(P, fig, a[i]) # specify which axis where show P
        np.set_printoptions(precision=3)
        print(P)

在这里,您可以使用 plt.subplots(n_rows, n_columns) 函数,其中 n_rows 是行数 n_columns 列数。

draw

有更多变化
def draw(data, figure, ax):
    df2 = DataFrame(data)
    line3 = FigureCanvasTkAgg(figure, root)
    line3.get_tk_widget().place(x=300,y=100)
    #line3.get_tk_widget().grid(row=5, column=5)
    df2.plot(kind='line', legend=True, ax=ax, fontsize=10) # ploting on ax axis space
    plt.close(figure)
    ax.set_title('Markov') # Specify the title of ax axis