我想用新函数调用覆盖我在python中创建的现有绘图。我想制作一个情节,看看它,然后用不同的参数再次调用相同的函数来产生另一个情节。我想第二个阴谋取代第一个阴谋。也就是说,我不想打开两个数字窗口;只是原始窗口被覆盖。
我在绘制(ion()),在不同的地方放置plot()和show()调用以及清除数字时尝试使用交互模式。我遇到的问题是:1。我永远不会覆盖和现有窗口,我总是打开更多2. show()阻止代码继续,我无法执行第二个函数调用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()
使用pyplot.ion
和pyplot.ioff
详细here。当我使用Python shell进行探索性数据分析时,我倾向于使用这些。
使用matplotlib.animation
包,详见this very comprehensible example。这是一种比上述简单解决方案更强大的方法,并允许各种有用/有趣的选项,例如将动画输出到视频文件等。
您可以随时清除轴(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)