Skip to main content
 首页 » 编程设计

python之使用matplotlib时对图的控制

2025年05月04日9unruledboy

我完全是个 matplotlib 菜鸟,目前正在对示例程序做一些小改动,看看会发生什么,并试图理解内容广泛但顺序不明的文档。

我正在尝试向现有的基于 tk gui 的 python 程序添加图形显示。我很高兴图表在新窗口中 float ,我不需要它嵌入到 tk 中(但是,也许下周)。

现有程序有一个用户按下的 tk.Button,它调用一个函数来检索一些数据并更新一些标签中的最大值/最小值/平均值。

我想增强功能,以便在更新标签的同时弹出数据图表。如果图表已经存在,下一次按下按钮应该用新的轨迹替换旧的轨迹并重新自动缩放轴。如果用户关闭图形窗口,下一次按下按钮应该会弹出一个新窗口。

每次按下一个新图表都很容易,添加 if not self.fig 测试让我归结为一个。它添加了持久跟踪,直到我添加了 plt.clf()。但是,如果用户关闭图形窗口,下面的代码不会重新创建它。我想我需要一些东西,比如图形是否可见,或者图形是否存在,而不是在 self.fig 上进行测试。或者也许我错过了明显的方法,还有更好的方法吗?非常感谢帮助。

import Tkinter as tk 
import os, sys 
import numpy as np 
import numpy.random as npr 
import matplotlib.pyplot as plt 
 
class Plotter(): 
    def __init__(self): 
        self.fig=None 
        self.ax=None     
 
    def do_stuff(self): 
        # make plausible data 
        a=np.arange(0,3,0.1) 
        b=npr.random(1) 
        c=np.power(a,b)             
 
        if not self.fig: 
            self.fig = plt.figure() 
        else: 
            plt.clf() 
 
        self.ax = self.fig.add_subplot(111) 
        self.ax.plot(a,c,'k--') 
        self.ax.set_yticklabels([]) 
        self.ax.set_xticklabels([]) 
 
        plt.show() 
 
 
p=Plotter() 
root=tk.Tk() 
 
rt = tk.Button(root, text='Capture', command=p.do_stuff) 
rt.grid(row=0, column=0) 
 
qt = tk.Button(root, text='quit', command=sys.exit) 
qt.grid(row=1, column=0) 
 
root.mainloop() 

请您参考如下方法:

使用新解决方案编辑:另一种解决方案是使用 pyplot.fignum_exists 检查您的图形是否仍然存在。所以你可以这样做:

if self.fig is None or not pyplot.fignum_exists(self.fig.number): 
    self.fig = pyplot.figure() 
# self.fig will now be active, either via an old still-open figure or a newly-created one 

后代的旧解决方案:

问题是,如果关闭图形不会影响您的 self.fig,尽管它会使 Figure 对象变得无用。一种选择是使用 pyplot.gcf() 而不是 pyplot.figure(),它代表“获取当前图形”。如果打开一个图形,这将返回一个现有图形,如果没有事件图形,它将创建一个新图形。所以在你的 do_stuff 方法中你可以使用 pyplot.gcf() 它会返回你的旧图形对象或新的,你不需要担心哪个.所以就这样做:

def do_stuff(self): 
    # make plausible data 
    fig = pyplot.gcf() 
    fig.clf() 
    self.ax = fig.add_subplot(111) 
    # etc. 

这显然有局限性。特别是,如果您的程序的任何其他部分也创建或使用 matplotlib 图,那么使用 gcf 可能会导致奇怪的结果,因为“当前”图可能是其他函数创建的其他图。不过,对于您现在正在做的事情,这似乎是一个可行的解决方案。