鱼C论坛

 找回密码
 立即注册
查看: 1534|回复: 16

[已解决]新手求助,通过滑块控制abc三个变量,来控制二次函数图像。

[复制链接]
发表于 2020-8-5 20:57:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import tkinter as tk
import matplotlib.pyplot as plt      
import numpy as np                    
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk  
from matplotlib.figure import Figure               
from mpl_toolkits import axisartist                 

window = tk.Tk()
window.title("二次函数")
window.geometry("600x600")

figure = Figure(figsize=(5, 4), dpi=100)   
axes = axisartist.Subplot(figure, 111)   
figure.add_axes(axes)         
canvas = FigureCanvasTkAgg(figure, master=window)        
toolbar = NavigationToolbar2Tk(canvas, window)           
toolbar.update()      
canvas.get_tk_widget().pack()
l = tk.Label(window,bg = "yellow",width = 20,text = "一元二次函数")
l.pack()

def Repaint(source):
        a_value = a_scale.get()            
        b_value = b_scale.get()              
        c_value = c_scale.get()              
        # 计算绘图中线
        mid = 0
        if a_value != 0:
                mid = -b_value / 2 / a_value      
        x = np.linspace(mid - 10, mid + 10, 200)         
        y = np.zeros(x.shape)
        for i in range(x.shape[0]):                        
                y[i] = a_value * x[i] ** 2 + b_value * x[i] + c_value
        y_min, y_max = -10, 10                                
        if a_value > 0:                                                   
                y_min, y_max = min(y) - 5, 50
        elif a_value < 0:                                             
                y_min, y_max = -50, max(y) + 5

ax = plt.gca()                                   
ax.spines["right"].set_color("none")         
ax.spines["top"].set_color("none")            
ax.xaxis.set_ticks_position("bottom")         
ax.yaxis.set_ticks_position("left")            
ax.spines["bottom"].set_position(("data",0))   
ax.spines["left"].set_position(("data",0))     


a_scale = tk.Scale(window,label = "a",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
b_scale = tk.Scale(window,label = "b",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
c_scale = tk.Scale(window,label = "c",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
a_scale.pack()
b_scale.pack()
c_scale.pack()

a = a_scale.get()  
b = b_scale.get()
c = c_scale.get()  



l = tk.Label(window,text = "二次函数图像",font = ("Arial",12),width = 15,height = 2)
l.pack()


plt.show()                                      

window.mainloop()
最佳答案
2020-8-5 23:06:04
本帖最后由 sunrise085 于 2020-8-6 19:27 编辑

看39行到55行
import tkinter as tk
import matplotlib.pyplot as plt      
import numpy as np                    
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk  
from matplotlib.figure import Figure                
from mpl_toolkits import axisartist                 

window = tk.Tk()
window.title("二次函数")
window.geometry("600x600")

figure = Figure(figsize=(5, 4), dpi=100)   
axes = axisartist.Subplot(figure, 111)   
figure.add_axes(axes)         
canvas = FigureCanvasTkAgg(figure, master=window)        
toolbar = NavigationToolbar2Tk(canvas, window)           
toolbar.update()      
canvas.get_tk_widget().pack()
l = tk.Label(window,bg = "yellow",width = 20,text = "一元二次函数")
l.pack()

def Repaint(source):
        a_value = a_scale.get()            
        b_value = b_scale.get()              
        c_value = c_scale.get()
        # 计算绘图中线
        mid = 0
        if a_value != 0:
            mid = -b_value / 2 / a_value       
        x = np.linspace(mid - 10, mid + 10, 200)         
        y = np.zeros(x.shape)
        for i in range(x.shape[0]):                        
            y[i] = a_value * x[i] ** 2 + b_value * x[i] + c_value
        y_min, y_max = -10, 10                                
        if a_value > 0:                                                    
            y_min, y_max = min(y) - 5, 50
        elif a_value < 0:                                             
            y_min, y_max = -50, max(y) + 5
#这里添加这四句,第一句清除原有图形,第二句根据新的xy值图形,第三句和第四句重绘图形。
        axes.clear()
        axes.plot(x,y)
        figure.canvas.draw()
        figure.canvas.flush_events()

#下面这几句导致又绘制了一张图
'''ax = plt.gca()                                   
ax.spines["right"].set_color("none")          
ax.spines["top"].set_color("none")             
ax.xaxis.set_ticks_position("bottom")          
ax.yaxis.set_ticks_position("left")            
ax.spines["bottom"].set_position(("data",0))   
ax.spines["left"].set_position(("data",0))   '''


a_scale = tk.Scale(window,label = "a",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
b_scale = tk.Scale(window,label = "b",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
c_scale = tk.Scale(window,label = "c",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
a_scale.pack()
b_scale.pack()
c_scale.pack()

a = a_scale.get()  
b = b_scale.get() 
c = c_scale.get()  



l = tk.Label(window,text = "二次函数图像",font = ("Arial",12),width = 15,height = 2)
l.pack()


plt.show()                                      

window.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-5 20:58:58 | 显示全部楼层
兄弟们为什么我写完的代码,会出现两张只有坐标的图,并没有一次函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-5 20:59:08 | 显示全部楼层
?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-5 21:05:27 | 显示全部楼层
怎么发照片呀。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:06:11 | 显示全部楼层
.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-5 21:08:32 | 显示全部楼层

【技巧】新鱼油怎么传图片?
https://fishc.com.cn/thread-168190-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-5 21:08:57 | 显示全部楼层

您现在无权限上传本地图片


但我们需要看图片解决问题,请您根据以下步骤正确上传图片!


                               
登录/注册后可看大图

图床地址路过图床 - 免费图片上传, 专业图片外链, 免费公共图床


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:30:12 | 显示全部楼层

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:30:48 | 显示全部楼层
Hello. 发表于 2020-8-5 21:08
您现在无权限上传本地图片

但我们需要看图片解决问题,请您根据以下步骤正确上传图片!

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:31:32 | 显示全部楼层
liuzhengyuan 发表于 2020-8-5 21:08
【技巧】新鱼油怎么传图片?
https://fishc.com.cn/thread-168190-1-1.html
(出处: 鱼C论坛)

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:33:12 | 显示全部楼层

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:35:15 | 显示全部楼层
以上是最后跑出来的图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:39:31 | 显示全部楼层

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:40:44 | 显示全部楼层
这个是最后想要的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-5 21:41:45 | 显示全部楼层
兄弟萌可以解答一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-5 23:06:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-8-6 19:27 编辑

看39行到55行
import tkinter as tk
import matplotlib.pyplot as plt      
import numpy as np                    
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk  
from matplotlib.figure import Figure                
from mpl_toolkits import axisartist                 

window = tk.Tk()
window.title("二次函数")
window.geometry("600x600")

figure = Figure(figsize=(5, 4), dpi=100)   
axes = axisartist.Subplot(figure, 111)   
figure.add_axes(axes)         
canvas = FigureCanvasTkAgg(figure, master=window)        
toolbar = NavigationToolbar2Tk(canvas, window)           
toolbar.update()      
canvas.get_tk_widget().pack()
l = tk.Label(window,bg = "yellow",width = 20,text = "一元二次函数")
l.pack()

def Repaint(source):
        a_value = a_scale.get()            
        b_value = b_scale.get()              
        c_value = c_scale.get()
        # 计算绘图中线
        mid = 0
        if a_value != 0:
            mid = -b_value / 2 / a_value       
        x = np.linspace(mid - 10, mid + 10, 200)         
        y = np.zeros(x.shape)
        for i in range(x.shape[0]):                        
            y[i] = a_value * x[i] ** 2 + b_value * x[i] + c_value
        y_min, y_max = -10, 10                                
        if a_value > 0:                                                    
            y_min, y_max = min(y) - 5, 50
        elif a_value < 0:                                             
            y_min, y_max = -50, max(y) + 5
#这里添加这四句,第一句清除原有图形,第二句根据新的xy值图形,第三句和第四句重绘图形。
        axes.clear()
        axes.plot(x,y)
        figure.canvas.draw()
        figure.canvas.flush_events()

#下面这几句导致又绘制了一张图
'''ax = plt.gca()                                   
ax.spines["right"].set_color("none")          
ax.spines["top"].set_color("none")             
ax.xaxis.set_ticks_position("bottom")          
ax.yaxis.set_ticks_position("left")            
ax.spines["bottom"].set_position(("data",0))   
ax.spines["left"].set_position(("data",0))   '''


a_scale = tk.Scale(window,label = "a",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
b_scale = tk.Scale(window,label = "b",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
c_scale = tk.Scale(window,label = "c",from_ = -10,to = 10,orient = tk.HORIZONTAL,
             length = 200,showvalue = 0,tickinterval = 2,resolution = 1,command = Repaint)
a_scale.pack()
b_scale.pack()
c_scale.pack()

a = a_scale.get()  
b = b_scale.get() 
c = c_scale.get()  



l = tk.Label(window,text = "二次函数图像",font = ("Arial",12),width = 15,height = 2)
l.pack()


plt.show()                                      

window.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 19:28:35 | 显示全部楼层
今天我又看了一下昨天的这个程序,找到重绘曲线的方法了。我把16楼的答案更新了。可以直接用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 06:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表