使用新函数调用覆盖现有Python图

时间:2015-07-22 17:48:28

标签: python-2.7 matplotlib

我想用新函数调用覆盖我在python中创建的现有绘图。我想制作一个情节,看看它,然后用不同的参数再次调用相同的函数来产生另一个情节。我想第二个阴谋取代第一个阴谋。也就是说,我不想打开两个数字窗口;只是原始窗口被覆盖。

我在绘制(ion()),在不同的地方放置plot()和show()调用以及清除数字时尝试使用交互模式。我遇到的问题是:1。我永远不会覆盖和现有窗口,我总是打开更多2. show()阻止代码继续,我无法执行第二个函数调用3.我使用交互模式和窗口在离开之前出现一秒

我想做的事似乎很简单,但我遇到了很大困难。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

最简单的解决方案

有很多方法可以做到这一点,其中最简单的方法是使用Line2D方法和set_ydata(...)重置情节pyplot.pause。 matplotlib的版本(我相信,<0.9,我相信)没有pyplot.pause,因此您可能需要更新自己的版本。这是一个简单的最小工作示例:

import numpy as np
from matplotlib import pyplot as plt

ph, = plt.plot(np.random.rand(100))

def change_plot():
    ph.set_ydata(np.random.rand(100))
    plt.pause(1)

while True:
    change_plot()

其他方法

  1. 使用pyplot.ionpyplot.ioff详细here。当我使用Python shell进行探索性数据分析时,我倾向于使用这些。

  2. 使用matplotlib.animation包,详见this very comprehensible example。这是一种比上述简单解决方案更强大的方法,并允许各种有用/有趣的选项,例如将动画输出到视频文件等。

  3. 您可以随时清除轴(set_ydata)并再次调用绘图命令,而不是使用Lines对象的pyplot.cla()方法。例如,如果您使用的是pyplot.contour,则返回的QuadContourSet没有set_zdata方法,但这样可以使用:

    import numpy as np
    from matplotlib import pyplot as plt
    
    X,Y = np.meshgrid(np.arange(100),np.arange(100))
    
    def change_plot():
        Z = np.random.random(X.shape)
        plt.cla()
        ph = plt.contour(X,Y,Z)
        plt.pause(1)
    
    while True:
        change_plot()
    

答案 1 :(得分:1)

编写您的绘图功能,如

def my_plotter(ax, data, style):
    ax.cla()
    # ax.whatever for the rest of your plotting
    return artists_added

然后将其称为

data = some_function()
arts = my_plotter(plt.gca(), data, ...)

或做

fig, ax = plt.subplots()

然后调用您的绘图功能,如

arts = my_plotter(ax, data, ...)

答案 2 :(得分:0)

我遇到了几乎相同的问题,并通过为每个图分配一个名称来解决它。

def acc(train_acc, test_acc, savename):
    plt.figure(savename) # If you remove this line, the plots will be added to the same plot. But, when you assign a figure, each plot will appear in a separate plot.
    ep = np.arange(len(train_acc)) + 1

    plt.plot(ep, train_acc, color="blue", linewidth=1, linestyle="-", label="Train")
    plt.plot(ep, test_acc, color="red",  linewidth=1, linestyle="-", label="Test")
    plt.title("NDCG")
    plt.xlabel("Iteration")
    plt.ylabel("NDCG@K")
    plt.legend(loc='lower right')
    plt.savefig(savename)