【问题标题】:Scatter plot in Tkinter using Matplotlib. No plot is showing使用 Matplotlib 在 Tkinter 中绘制散点图。没有情节显示
【发布时间】:2021-10-07 08:07:54
【问题描述】:

我在网上搜索了在 tkinter 窗口中创建实时 matplotlib 散点图,但发现大量不同的信息使其难以理解。例如,我有时看到一些人使用 matplotlib.pyplot,有时我会看到有些人使用 matplotlib.figure。我不知道这两个模块之间的真正区别是什么。

我创建了下面的示例代码,当我单击“Graph It”按钮时,我认为应该在 tkinter 根窗口内简单地创建一个 matplotlib 散点图。当我点击它时它什么也没做。最终目标是在 tkinter 中有一个散点图,每当从传感器读取新数据时它就会更新,但我开始很简单。还应该注意的是,这是我第一次接触 matplotlib,所以我可能忽略了一些微不足道的事情。任何帮助表示赞赏。


#Python 3.7.9#
import tkinter as tk
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg,NavigationToolbar2Tk)
import numpy as np




figure = Figure(figsize = (5,5), dpi = 100)
ax = figure.add_subplot(111)


def plot():
    

    x = np.random.rand(1,10)
    y = np.random.rand(1,10)
    
    ax.scatter(x,y)
 
    
 
    
root = tk.Tk()


canvas = FigureCanvasTkAgg(figure, root)
canvas.draw()
canvas.get_tk_widget().pack(pady = 10)

toolbar = NavigationToolbar2Tk(canvas,root)
toolbar.update()
canvas.get_tk_widget().pack()


button = tk.Button(root, text = "Graph It", command = plot)
button.pack()


root.mainloop()

【问题讨论】:

    标签: python numpy matplotlib tkinter plot


    【解决方案1】:

    问题在于您没有“更新”情节。 只需对代码进行最少的修改,您只需安排重新绘制图形。 例如,您可以使用包装器canvas 对象(或figure.canvas)在每个数据更新步骤中更新图形的画布,如下所示:

    import tkinter as tk
    
    import numpy as np
    from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)
    from matplotlib.figure import Figure
    
    figure = Figure(figsize=(5, 5), dpi=100)
    ax = figure.add_subplot(111)
    
    
    def plot():
        x = np.random.rand(1, 10)
        y = np.random.rand(1, 10)
        ax.scatter(x, y)
        canvas.draw()
    
    
    root = tk.Tk()
    canvas = FigureCanvasTkAgg(figure, root)
    canvas.draw()
    canvas.get_tk_widget().pack(pady=10)
    toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar.update()
    canvas.get_tk_widget().pack()
    button = tk.Button(root, text="Graph It", command=plot)
    button.pack()
    root.mainloop()
    

    输出窗口:

    但是,在这种情况下,您在每个更新步骤中添加/创建一个新的散点图。如果你想扩展原始数据并根据更新后的数据进行更新,你可以找到不同的方法in this post来更新单个散点图。

    【讨论】:

    • 成功了!谢谢你。我想我对“FigureCanvasTkAgg”类有点困惑,它是专门为将 matplotlib 图形添加到 Tkinter 窗口而制作的特殊类吗?我查看了我认为是“FigureCanvasTkAgg”类方法的文档,但没有看到名为 .get_tk_widget() 的方法。这个方法在做什么?这是我正在查看的documentation
    • 我假设FigureCanvasTkAgg 是解决Tkinter 和matplotlib 之间集成的包装器,但是,起初我尝试使用figure.canvas.draw() 直接更新matplotlib 的画布并且它也有效。所以我假设使用 matploltib 执行重新绘制,并且包装类提供了与 wigdet 相关的东西。
    猜你喜欢
    • 2018-06-23
    • 2021-10-14
    • 1970-01-01
    • 2023-03-13
    • 2021-12-06
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多