使用matplotlib和更新文本文件生成实时图

时间:2017-07-26 20:02:42

标签: python matplotlib

我正在尝试使用animation中的matplotlib函数生成实时数据图。我从以下链接中引用本教程以获得我的支持:Realtime Plotting in MatPlotLib

我正在阅读的data.txt文件每秒都会使用新数据进行更新。进入的数据如下:[0.0263671875, 0.03515625, 1.0087890625][0.01171875, 0.0146484375, 0.4404296875][0.01171875, 0.0146484375, 0.4404296875] ......等等。

animate函数的前三行是提取每个数组中的第三个元素:

data = pd.read_csv("C:\\Users\\Desktop\\data.txt", sep="\[|\]\[|\]",engine = 'python', header = None)
    data = data.iloc[0]
    data = data.astype(str).apply(lambda x: x.split(',')[-1]).astype(float)
    data.pop(0)

我在Jupyter笔记本中验证了这段代码,输出如下(我正在寻找): enter image description here

我的第一个挑战来自于我试图实时生成图表的时候。我的数据没有x轴(时间)。因此,我的第一个障碍之一是在数据流更新时生成人工x轴。上面链接的教程中的代码用作模板。我将指出我为了特定目的而努力修改的领域。

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

def animate(i):
    data = pd.read_csv("C:\\Users\\Desktop\\data.txt", sep="\[|\]\[|\]",engine = 'python', header = None)
    data = data.iloc[0]
    data = data.astype(str).apply(lambda x: x.split(',')[-1]).astype(float)
    data.pop(0)
    xar = []
    yar = []
    for eachLine in data:
        if len(eachLine)>1:
            x,y = eachLine.split(',')
            xar.append(int(x))
            yar.append(int(y))
    ax1.clear()
    ax1.plot(xar,yar)
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.show()

除了人工创建x轴编号以便我可以创建绘图外,我还需要修改for循环:

xar = []
yar = []
for eachLine in data:
    if len(eachLine)>1:
        x,y = eachLine.split(',')
        xar.append(int(x))
        yar.append(int(y))

在链接中提供的示例中,他们的数据流有一个xy数据点,由一列分隔。我拥有的数据流只是一个值。

如何将我的代码修改为(1)添加适当的x轴以便能够绘图,以及(2)正确地通过for循环以便将值附加到xar和{{ 1}}实时绘制图形。

编辑1 我尝试了以下,但它不起作用,需要一些帮助...但这是我的第一枪。我收到了错误:

yar

我的代码如下:

if len(eachLine)>1:

TypeError: object of type 'numpy.float64' has no len()

谢谢!

1 个答案:

答案 0 :(得分:2)

对于读入的数据一无所知,很难理解问题。但是,一般情况下,您将从数据框中绘制一列,如下所示

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

def animate(i):
    data = pd.read_csv(...)
    yar = data[ "column to plot" ]
    xar = range(len(data))
    ax.clear()
    ax.plot(xar,yar)

ani = animation.FuncAnimation(fig, animate, interval=10)
plt.show()