自定义绘图功能在第二次从交互式提示中调用时不执行任何操作

时间:2014-07-10 01:25:53

标签: python matplotlib ipython spyder

所以我尝试编写一个自定义绘图函数,其行为类似于plot,因为您可以调用subplot,然后调用new_plot将被定向到该子图,随后调用将以不同的颜色等绘制在原始图的顶部。

但是,当我尝试从IPython中的交互式提示中多次绘制时,只有第一次调用有效。如果我在脚本或单个命令中多次调用它,它就可以工作。

除了证明问题的最低限度之外,我已经删除了所有内容:

import matplotlib.pyplot as plt
from numpy.random import randn


def new_plot():
    # get a figure/plot
    ax = plt.gca()

    # Plot the poles and set marker properties
    ax.plot(randn(10), randn(10))


if __name__ == "__main__":
    plt.subplot(2, 1, 1)
    new_plot()
    new_plot()
    plt.subplot(2, 1, 2)
    new_plot()
    new_plot()
    plt.show()

运行此脚本可以正常工作,在每个子图中彼此重叠生成2个不同颜色的图。此外,在一行IPython交互式提示中调用该函数两次工作正常:

In [3]: new_plot()
   ...: new_plot()
   ...: 

但是,连续两次调用该函数不起作用,只有第一次调用成功,其余调用无声地失败:

In [4]: new_plot()

In [5]: new_plot()

Whyyyyyyyyyyyyyyyyy?

1 个答案:

答案 0 :(得分:1)

您遇到了问题,因为您正在将Matplotlib的面向对象接口与状态机环境Pyplot相结合。更多信息hereThis question也很有帮助。

您可以在new_plot()

中使用Pyplot使您的示例正常工作
def new_plot():
    # Pyplot plot function
    plt.plot(randn(10), randn(10))

或在调用new_plot()后通过IPython交互式提示调用draw()

Pyplot函数(在这种情况下为plt.plot)会自动重绘图形,但面向对象的接口(ax.plot)的方法却不会。