所以我尝试编写一个自定义绘图函数,其行为类似于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?
答案 0 :(得分:1)
您遇到了问题,因为您正在将Matplotlib的面向对象接口与状态机环境Pyplot相结合。更多信息here。 This question也很有帮助。
您可以在new_plot()
:
def new_plot():
# Pyplot plot function
plt.plot(randn(10), randn(10))
或在调用new_plot()
后通过IPython交互式提示调用draw()。
Pyplot函数(在这种情况下为plt.plot
)会自动重绘图形,但面向对象的接口(ax.plot
)的方法却不会。