Python 使用matplotlib绘制传入的数字流

Python 使用matplotlib绘制传入的数字流,python,matplotlib,Python,Matplotlib,我想把输入的数字流绘制成实时图形。目前,它所做的只是显示一个没有内容的灰色图形窗口。数据按照我的预期打印到终端 import socket import matplotlib as m import matplotlib.pyplot as plt import numpy as np import matplotlib.animation as animation from matplotlib import style style.use('fivethirtyeight') fig =

我想把输入的数字流绘制成实时图形。目前,它所做的只是显示一个没有内容的灰色图形窗口。数据按照我的预期打印到终端

import socket
import matplotlib as m
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
from matplotlib import style

style.use('fivethirtyeight')

fig = plt.figure()
plt.axis([0,10,0,1])
plt.ion()


samples = 15*200

channels = [np.linspace(start= 0, stop = 0,num = samples)]

def animate():
    plt.plot(range(0,samples),channels[0])
    plt.draw()


UDP_IP = "127.0.0.1"
UDP_PORT = 8888
sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))

k = 0
while True:
    data, addr = sock.recvfrom(2048) # buffer size is 1024 bytes      
    # write data to channel
    channels[0][k % samples] = eval(data)[0]
    animate()
    print channels[0][k % samples]

plt.draw()
替换为
plt.pause(t)
,其中
t
是帧之间的等待时间(不应为0)。这确保了图形实际上有时间进行更新,GUI可以处理任何事件。

如果调用
fig.canvas.draw()
,而不是
plt.draw()
,它是否解决了问题?更新的方法属于画布对象。使用pyplot的基于状态的接口,不太清楚引用了哪个对象,您可能更喜欢OO接口。特别是因为您保留了对
fig
的引用,您不妨显式地调用它。

为什么要将
频道
绑定到单个列表的列表?删除
np.linspace
周围的
[]
,并删除每个引用上的
[0]
,以获得更干净的代码。
plt.draw()
的操作与
plt.gcf().canvas.draw_idle()
的操作相同;因此,如果一个不起作用,另一个也不会起作用。如果您对解决方案感兴趣,请阅读我的答案。OP标记为solved。因此,这一点必须是最重要的。但我不认为这些调用是完全相同的,可能对故障排除有用。OP将disred Figure对象分配给
fig
,调用其
draw
方法可能不同于
plt.gcf().canvas.draw\u idle
。也许OP有干预代码将当前数字设置为其他数字。OP使用的后端可能没有调用
draw
,因为UI状态由于某种原因不是空闲的
plt.draw()
的作用与
plt.gcf().canvas.draw\u idle()
的作用相同
fig.canvas.draw()
不同,因为它不绘制当前图形,而是绘制图形
fig
。但是,由于代码中只有一个数字,这也是相同的。