python - Python-从变化的文本文件更新实时图形

原文 标签 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)

最佳答案

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

Python file objects are usually line-buffered by default,因此当您从f.write(str(i)+','+str(j)+'\n')线程内部调用FileWriter时,文本文件不会立即在磁盘上更新。因此,open("sampleText.txt","r").read()返回一个空字符串,因此您没有要绘制的数据。

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

相关文章:

python - 创建“集合词典”

python - 准备熊猫数据框以使用误差线进行绘图

python - matplotlib:颜色栏调整图像大小?

android - Android-如何将标签的文本与其轴对齐?

python - 使用python的单词袋模型的简单k均值聚类

python - Python Sympy打印差异化的用户定义复合功能;如何切换替代

javascript - 高图使用“ shared:true”避免工具提示上的“跳转效果”

linux - 我们如何比较两个程序的依赖图?

python - 在matplotlib中绘制多个子图之间的区域关联线

python - 在Python 3.5.1中使用pylab.scatter和cmap