在外部函数

时间:2017-02-22 11:58:50

标签: python-2.7 matplotlib plot jupyter-notebook jupyter

我正在运行推理算法,并希望在每次迭代后显示似然函数。但是,绘图功能是我导入的包的一部分。我设法将它拼凑在一起,以便在外部gui窗口中使用tkAgg后端显示情节,但有没有办法让它显示为内联图?以下是我现在使用的内容:

最小工作示例

Jupyter Code

%matplotlib inline
#import matplotlib
#matplotlib.use('tkAgg')
import matplotlib.pyplot as plt
import sys
import numpy as np
sys.path.append('/path/to/file')
#______________________________________________________________

import testclass
a = testclass.test()
a.iterator()

如下所示,这应该迭代地绘制一系列点,一次用一个点更新图。当我内联运行时,我只在完成运行后获得完整的情节。

类代码

import numpy as np
import matplotlib
matplotlib.use('tkAgg')

import matplotlib.pyplot as plt
import time

class test(object):

    def __init__(self):

        self.x = np.random.randint(0,50,size=5)

    def iterator(self):

        for i in range(5):

            self.plotter(i)
            st = time.time()
            while (time.time()-st)<2:
                pass


    def plotter(self,i):
        if not hasattr(self,'fig'):
            self.fig = plt.figure()
        else:
            plt.close(self.fig)
            self.fig = plt.figure()

        #plt.ion()

        self.fig.gca().plot(self.x[:i],'o')

        self.fig.show()

原始代码

笔记本代码

import matplotlib
matplotlib.use('tkAgg')

import mypackage

class_instance = mypackage.myclass()

myclass.fit(n_iterations=100)

绘图函数是类的绑定方法,由fit方法调用。

绘图功能函数

def update_plot(self,r,LLst,kkk):
    if not hasattr(self,'LL_fig'):
        self.LL_fig = plt.figure()
    else:
        plt.close(self.LL_fig)
        self.LL_fig = plt.figure()
    #plt.ion()
    #self.LL_fig.clf()
    ax = self.LL_fig.gca()
    ax.plot(LLst[1:],linestyle='-',marker='.')
    #plt.gca().set_xlim([0,np.max([50,kkk])])
    ax.set_xlim([0,np.max([50,kkk])])
    ax.set_xlabel('EM iter')
    ax.set_ylabel('$\mathcal{L}( \\theta )$')

    seaborn.despine(trim=True,offset=15)
    #plt.draw()
    self.LL_fig.show()
    #display.clear_output(wait=True)
    #display.display(plt.gcf())

    sys.stdout.write("\riter: %s || LL: %s || message: %s" %(kkk,np.round(LLst[-1],decimals=2), r['status']))
    sys.stdout.flush()

另外,如果我不关闭并重新初始化&#39;每次这个数字,情节开始变空。任何帮助将不胜感激!

编辑:

如果我尝试使用matplotlib inline而不是tkAgg后端,我会收到以下警告消息:

UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "

1 个答案:

答案 0 :(得分:1)

使用细胞魔法%matplotlib inline(如果你不熟悉细胞魔法,只需在它的一个细胞中将它放在一条线上)