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
中figure
和axes
的概念
图就像一个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
在 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
figure
和axes
的概念
图就像一个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