Python 如何在matplotlib中以交互模式移动图形窗口?

Python 如何在matplotlib中以交互模式移动图形窗口?,python,matplotlib,Python,Matplotlib,我正在尝试使用matplotlib监视实时数据 我发现我可以在Pyplot中使用交互模式动态更新plot 它工作得很好,但有一个问题是“我根本无法操纵图形窗口”。例如,移动或重新调整“地物”窗口的大小 这是我的密码 这是交互模式的缺点吗?还是我用错了 import matplotlib.pyplot as plt import time import math # generate data x = [0.1*_a for _a in range(1000)] y = map(lambda x

我正在尝试使用matplotlib监视实时数据

我发现我可以在Pyplot中使用交互模式动态更新plot

它工作得很好,但有一个问题是“我根本无法操纵图形窗口”。例如,移动或重新调整“地物”窗口的大小

这是我的密码

这是交互模式的缺点吗?还是我用错了

import matplotlib.pyplot as plt
import time
import math

# generate data
x = [0.1*_a for _a in range(1000)]
y = map(lambda x : math.sin(x), x)

# interactive mode
plt.ion() # identical plt.interactive(True)

fig, ax = plt.subplots()
# ax = plt.gca()
lines,  = ax.plot([], [])

# ax.set_ylim(-1, 1)
ax.grid()

MAX_N_DATA = 100
x_data = []
y_data = []
for i in range(len(x)):
    # New data received
    x_data.append(x[i])
    y_data.append(y[i])

    # limit data length
    if x_data.__len__() > MAX_N_DATA:
        x_data.pop(0)
        y_data.pop(0)

    # Set Data
    lines.set_xdata(x_data)
    lines.set_ydata(y_data)

    # The data limits are not updated automatically.
    ax.relim()
    # with tight True, graph flows smoothly.
    ax.autoscale_view(tight=True, scalex=True, scaley=True)

    # draw
    plt.draw()
    time.sleep(0.01)

谢谢。

尽管我仍然认为您应该使用bokeh,但我将告诉您如何使用matplotlib

它无法工作的问题在于matplotlib的事件循环未处于活动状态,因此无法消化窗口事件(如关闭或调整大小)。不幸的是,不可能从外部触发这种消化。您需要做的是使用matplotlib的动画系统。
您的代码实际上已经为它做好了充分的准备,因此您可以使用它


如中所示,将
plt.draw()
替换为
plt.pause(0.05)
。这就解决了我的问题。

matplotlib对于实时可视化来说并不太好。。。我建议退房,谢谢。但这似乎对我不起作用。正如我提到的,我必须绘制实时数据。因此,在调用
draw
show
时,我没有要绘制的完整数据集。相反,它是随着时间的推移而积累的,并在飞行中绘制。我将检查博克。谢谢:D@JaeJunLEE很抱歉完全忘记了这一点:D好的,第三个参数
范围(len(x))
可以是一个生成器,它为
showdata
生成数据。如果此生成器从队列或其他缓冲区获取数据,这些缓冲区中填充了实际计算的结果,那么您将获得所需的数据。你也可以看看我的实时尖峰图。它使用多处理来避免matplotlibs仅主线程的问题。当您取消注释
importnest
时,它应该与随机示例一起运行。
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import math

# generate data
x = [0.1*_a for _a in range(1000)]
y = map(lambda x : math.sin(x), x)

# don't need ion, we're using block=True (see end of code)

fig, ax = plt.subplots()
fig.show()
# ax = plt.gca()
lines,  = ax.plot([], [])

# ax.set_ylim(-1, 1)
ax.grid()

MAX_N_DATA = 100
x_data = []
y_data = []

def showdata(i):

    # New data received
    x_data.append(x[i])
    y_data.append(y[i])

    # limit data length
    if x_data.__len__() > MAX_N_DATA:
        x_data.pop(0)
        y_data.pop(0)

    # Set Data
    lines.set_xdata(x_data)
    lines.set_ydata(y_data)

    # The data limits are not updated automatically.
    ax.relim()
    # with tight True, graph flows smoothly.
    ax.autoscale_view(tight=True, scalex=True, scaley=True)

    # draw will be called by the animation system

# instead of time.sleep(0.01) we use an update interval of 10ms
# which has the same effect
anim = FuncAnimation(fig, showdata, range(len(x)), interval=10, repeat=False)

# start eventloop
plt.show(block=True)