我想展示两张图,这些图由我的程序不断更新。但是,我尝试的解决方案只能显示两个图形中的第二个,而第一个图形只显示为空白窗口。
这是我的代码:
def show1(x, y):
fig = plt.figure(1)
fig.canvas.set_window_title("Plot1")
plt.plot(x, y)
plt.pause(0.01)
plt.show()
plt.figure(1).clear()
def show2(x, y):
fig = plt.figure(2)
fig.canvas.set_window_title("Plot2")
plt.plot(x, y)
plt.pause(0.01)
plt.show()
plt.figure(2).clear()
plt.ion()
x = [1, 2, 3, 4]
i = 0
while True:
y1 = [j + i for j in x]
show1(x, y1)
y2 = [j + 2 * i for j in x]
show2(x, y2)
time.sleep(2)
i += 1
因此,在循环的每次迭代中,将更新要绘制的值,并重新绘制图形。在绘制每个图形之后,我调用plt.figure(k).clear()
来清除图形k
,这样下次我写入图形时,我将在空白画布上书写(而不是将多个图形连续添加到相同的图形中)图)。
但是会发生什么事,我看到第一张图显示了它的图,但是一旦第二张图被绘制出来,第一张图就变成了一个空白窗口,只有第二张图实际上仍然显示其显示的图
如何修改我的代码,以便两个图表都有持久显示?
答案 0 :(得分:1)
我希望这就是你想要的。
import matplotlib.pyplot as plt
import time
fig1, ax1 = plt.subplots()
fig1.canvas.set_window_title("Plot1")
fig2, ax2 = plt.subplots()
fig2.canvas.set_window_title("Plot2")
x = [1, 2, 3, 4]
i = 0
# initial plots, so Lines objects exist
line1, = ax1.plot(x, [j + i for j in x])
line2, = ax2.plot(x, [j + 2 * i for j in x])
def show1(y):
line1.set_ydata(y) # update data, i.e. update Lines object
ax1.relim() # rescale limits of axes
ax1.autoscale_view() # rescale limits of axes
fig1.canvas.draw() # update figure because Lines object has changed
def show2(y):
line2.set_ydata(y)
ax2.relim()
ax2.autoscale_view()
fig2.canvas.draw()
while True:
y1 = [j + i for j in x]
show1(y1)
y2 = [j + 2 * i for j in x]
show2(y2)
time.sleep(2)
i += 1
不要一遍又一遍地清除图形,只需更新图形(即Lines
对象)。这可能是有用的,例如当包含Slider时(参见here,部分代码来自此matplotlib示例)。