Python - 从更改的文本文件更新实时图形

时间:2015-10-31 21:51:55

标签: python matplotlib graph

我有一个线程,每2秒连续写入一个文本文件。 Matplotlib图(实时更新图)引用了相同的文件。

所以当我启动脚本时,我打开一个图表并在一个线程上启动文件写入过程。文件正在更新但不是我的图表。只有在文件写入完成后,文件上的数据才会显示在图表上。

但这不是实时图的概念。我希望数据表示在数据被写入文件时显示。我在这做错了什么?

这是我的主要功能

def Main():
    t1=Thread(target=FileWriter)
    t1.start()
    ani = animation.FuncAnimation(fig, animate, interval=1000)
    plt.show()
    print("done")

我的文件写入功能

def FileWriter():
    f=open('F:\\home\\WorkSpace\\FIrstPyProject\\TestModules\\sampleText.txt','w')
    k=0
    i=0
    while (k < 20):
        i+=1
        j=randint(10,19)
        data = f.write(str(i)+','+str(j)+'\n')
        print("wrote data")
        time.sleep(2)
        k += 1

我的图表功能

def animate(i):
    pullData = open("sampleText.txt","r").read()
    dataArray = pullData.split('\n')
    xar = []
    yar = []
    for eachLine in dataArray:
        if len(eachLine)>1:
            x,y = eachLine.split(',')
            xar.append(int(x))
            yar.append(int(y))
    ax1.clear()
    ax1.plot(xar,yar)

2 个答案:

答案 0 :(得分:0)

问题与matplotlib无关,而是与您如何读取和写入数据到文本文件有关。

Python file objects are usually line-buffered by default,因此当您从<?php echo do_shortcode('[go_greenredempoints]'); ?> 帖子中调用f.write(str(i)+','+str(j)+'\n')时,您的文本文件不会立即在磁盘上更新。因此,FileWriter返回一个空字符串,因此您没有要绘制的数据。

要强制文本文件“立即”更新,您可以在写入后立即调用open("sampleText.txt","r").read(),也可以在打开文件时将缓冲区大小设置为零,例如: f.flush()(请参阅此previous SO question)。

答案 1 :(得分:0)

自从发布以来已经有几年了,但是我正在使用它,但是遇到了一个问题,我需要在每个周期后更新图表。

我尝试使用ali_m的建议:f=open('./dynamicgraph.txt','a', 0),但是缓冲“无法设置为0”时出错。

如果将flush()函数放到FileWriter while循环中,它将在每个循环后更新图形。以下是该程序的完整代码,它将在运行时绘制图形:

#!usr/bin/python3
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import time
from random import randrange
from threading import Thread

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


def FileWriter():
    f=open('./dynamicgraph.txt','a')
    i=0
    while True:
        i+=1
        j=randrange(10)
        data = f.write(str(i)+','+str(j)+'\n')
        print("wrote data")
        time.sleep(1)
        f.flush()


def animate(i):
    pullData = open("dynamicgraph.txt","r").read()
    dataArray = pullData.split('\n')
    xar = []
    yar = []
    for eachLine in dataArray:
        if len(eachLine)>1:
            x,y = eachLine.split(',')
            xar.append(int(x))
            yar.append(int(y))
    ax1.clear()
    ax1.plot(xar,yar)

def Main():
    t1=Thread(target=FileWriter)
    t1.start()
    ani = animation.FuncAnimation(fig, animate, interval=1000)
    plt.show()
    print("done")

Main()