gpt4 book ai didi

python - 如何使用 tkinter GUI 可视化 matplotlib 预测?

转载 作者:行者123 更新时间:2023-12-01 07:59:38 33 4
gpt4 key购买 nike

我有一个场景,我对特定数据集进行了预测。现在我想使用 Tkinter 可视化该预测图。

我的机器学习模型如下所示,由图表组成:

# Importing Libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sys

# Importing the Batsmen Dataset
dataset = pd.read_csv('Batsmen/Batsmen.csv')
X = dataset.iloc[:, [1, 2, 3, 4, 5, 6]].values

# Using Elbow Method to find the optimal number of Clusters
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', n_init=10, max_iter=300, random_state=0)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')
plt.show()

我尝试了如下所示:

from tkinter import *

# these four imports are important
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

def plot():
# Importing Libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sys

# Importing the Batsmen Dataset
dataset = pd.read_csv('Batsmen/Batsmen.csv')
X = dataset.iloc[:, [1, 2, 3, 4, 5, 6]].values

# Using Elbow Method to find the optimal number of Clusters
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', n_init=10, max_iter=300, random_state=0)
kmeans.fit(X)
wcss.append(kmeans.inertia_)

root = Tk()

def app():
# initialise a window.
root = Tk()
root.config(background='white')
root.geometry("1000x700")

lab = Label(root, text="Live Plotting", bg = 'white').pack()

fig = Figure()

ax = fig.add_subplot(111)
ax.set_title('The Elbow Method')
ax.set_xlabel('Number of Clusters')
ax.set_ylabel('WCSS')
ax.grid()

graph = FigureCanvasTkAgg(fig, master=root)
graph.get_tk_widget().pack(side="top",fill='both',expand=True)

def plotter():
ax.cla()
ax.grid()
dpts = plot()
ax.plot(range(1, 11), wcss, marker='o', color='orange')
graph.draw()
time.sleep(1)

def gui_handler():
threading.Thread(target=plotter).start()

b = Button(root, text="Start/Stop", command=gui_handler, bg="red", fg="white")
b.pack()

root.mainloop()

if __name__ == '__main__':
app()

但是它不起作用!

我只想在 Tkinter GUI 上显示预测,当我按下 GUI 中的预测按钮时,我希望图形显示在 GUI Canvas 内。那么,有人可以帮我做同样的事情吗?

最佳答案

如果我使用 root.after() 而不是线程,你的代码对我有用。

可能在大多数 GUI 框架中,线程应该(或不能)更改 GUI 中的元素。

在我的计算机上,当我按下运行线程的按钮时,带有线程的代码就会结束工作。

我运行plotter,它不使用whilesleep,而是使用after(1000,plotter)来1000ms(1s)后再次运行

from tkinter import *
from random import randint

# these two imports are important
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

continuePlotting = False

def change_state():
global continuePlotting
if continuePlotting == True:
continuePlotting = False
else:
continuePlotting = True


def data_points():
f = open("data.txt", "w")
for i in range(10):
f.write(str(randint(0, 10))+'\n')
f.close()

f = open("data.txt", "r")
data = f.readlines()
f.close()

l = []
for i in range(len(data)):
l.append(int(data[i].rstrip("\n")))
return l

def app():
# initialise a window.
root = Tk()
root.config(background='white')
root.geometry("1000x700")

lab = Label(root, text="Live Plotting", bg = 'white').pack()

fig = Figure()

ax = fig.add_subplot(111)
ax.set_xlabel("X axis")
ax.set_ylabel("Y axis")
ax.grid()

graph = FigureCanvasTkAgg(fig, master=root)
graph.get_tk_widget().pack(side="top",fill='both',expand=True)

def plotter():
if continuePlotting:
ax.cla()
ax.grid()
dpts = data_points()
ax.plot(range(10), dpts, marker='o', color='orange')
graph.draw()
root.after(1000, plotter)

def gui_handler():
change_state()
plotter()

b = Button(root, text="Start/Stop", command=gui_handler, bg="red", fg="white")
b.pack()

root.mainloop()

if __name__ == '__main__':
app()
<小时/>

编辑:在新代码中,您不会运行循环,因此不需要线程或 after()

但是您还有其他基本问题:

您的缩进错误,并且 mainloop() 位于 app() 之外 - 它在 app() 之前执行

在以前的版本中,plotter 位于 app() 内部 - 如果您在外部需要它,那么您就会遇到局部变量的问题 - 例如 ax -并且您必须使用 global 才能在其他函数中访问这些变量。或者你必须使用这个值作为参数来运行函数 - 即。 绘图仪(ax、wcss、图表)

这个版本使用global,它对我有用。我没有您的 CSV,并且不想运行 sklearn,因此我输入了一些虚假数据。

from tkinter import *

# these four imports are important
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure

def plot():
# Importing Libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import sys

# Importing the Batsmen Dataset
# dataset = pd.read_csv('Batsmen/Batsmen.csv')
dataset = pd.DataFrame({
'a': range(10),
'b': range(10),
'c': range(10),
'd': range(10),
'e': range(10),
'f': range(10),
'g': range(10),
})

X = dataset.iloc[:, [1, 2, 3, 4, 5, 6]].values

# Using Elbow Method to find the optimal number of Clusters
from sklearn.cluster import KMeans

global wcss
wcss = range(1, 11)
#wcss = []
# for i in range(1, 11):
# kmeans = KMeans(n_clusters=i, init='k-means++', n_init=10, max_iter=300, random_state=0)
# kmeans.fit(X)
# wcss.append(kmeans.inertia_)

def plotter():
global wcss
global ax
global graph

ax.cla()
ax.grid()
dpts = plot()
ax.plot(range(1, 11), wcss, marker='o', color='orange')
graph.draw()

def gui_handler():
plotter()

def app():
global ax
global graph

# initialise a window.
root = Tk()
root.config(background='white')
root.geometry("1000x700")

lab = Label(root, text="Live Plotting", bg = 'white').pack()

fig = Figure()

ax = fig.add_subplot(111)
ax.set_title('The Elbow Method')
ax.set_xlabel('Number of Clusters')
ax.set_ylabel('WCSS')
ax.grid()

graph = FigureCanvasTkAgg(fig, master=root)
graph.get_tk_widget().pack(side="top",fill='both',expand=True)

b = Button(root, text="Start/Stop", command=gui_handler, bg="red", fg="white")
b.pack()

root.mainloop()

if __name__ == '__main__':
app()

关于python - 如何使用 tkinter GUI 可视化 matplotlib 预测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781487/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com