1

私はPythonにかなり慣れていないので、ファイルに保存されているデータに基づいてプロットを作成しようとしています。このファイルはいつでも更新される可能性があるため、3秒ごとに図面を更新しようとしています(CPUをすべて使用しているわけではありません)。私の問題は、昼食後にGUIがフリーズすることです。

#!/usr/bin/python
# _*_ coding: utf8 _*_

import matplotlib.pyplot as plt
import numpy as np
import time 

plt.ion()
plt.figure()
i=0
while 1:
    taille=0
    fichier=np.loadtxt('data/US.SAVE')
    fichier1=np.loadtxt('data/cond.SAVE')
    taille1=np.size(fichier1[:,1])
    taille=np.size(fichier[:,1])

    min=min(fichier[0,0],fichier1[0,0]);

    fichier[:,0]=fichier[:,0]-min
    fichier1[:,0]=fichier1[:,0]-min


    if (taille != taille1) :
        printErrors("TAILLE DE FICHIERS DIFFERENTES")


    nb_chunks=np.size(fichier1[1,:])
    nb_inputs=np.size(fichier[1,:])


    plt.subplot(3,1,1)

    plt.bar(fichier[:,0],fichier[:,1],align='center',width=0.0001, facecolor='b', label="US")
    x1,x2,y1,y2 = plt.axis()
    x1=x1-0.0001
    plt.axis([x1, x2, y1, 1.2])
    plt.legend(ncol=3,prop={'size':9})
    plt.title("US ") 
    plt.ylabel('Activation')
    plt.xlabel('Time')

    plt.subplot(3,1,2)

    plt.bar(fichier1[:,0],fichier1[:,1],align='center',width=0.0001, facecolor='b', label="response")



    plt.axis([x1, x2, y1, 1.2])
    plt.legend(ncol=3,prop={'size':9})
    plt.title("Response ") 
    plt.ylabel('Activation')
    plt.xlabel('Time')


    plt.subplot(3,1,3)

    plt.bar(fichier[:,0]-fichier1[:,0],fichier1[:,1],align='center',width=0.0001, facecolor='b', label="Error")
    plt.axis([x1, x2, y1, 1.2])
    plt.legend(ncol=3,prop={'size':9})
    plt.title("Error") 
    plt.ylabel('Activation')
    plt.xlabel('Time')
    plt.draw()
    name1='data/Conditionnement.eps'
    plt.savefig(name1,dpi=256)
    plt.draw()
    del fichier,fichier1,min
    i=i+1

    time.sleep(3)   

plt.show()

ファイルベースの図面で他のトピックは見つかりませんでした。

4

2 に答える 2

2

plt.pause(3)の代わりに関数を使用しますtime.sleep()pauseFigure を再描画するために必要な gui メイン ループへの呼び出しが含まれています。

参照: Python- 1 秒プロット連続プレゼンテーションmatplotlib リアルタイム線形線python 2 の pylab.ion()、matplotlib 1.1.1、およびプログラム実行中のプロットの更新

于 2013-02-01T15:09:33.190 に答える
2

@tcaswell(問題を解決する)の回答に加えて、スクリプトをよりオブジェクト指向の方法で再考することをお勧めします。

私はこれを試しました:

plt.ion()
plt.figure()
plt.show()

while True:
    x=np.arange(10)
    y=np.random.rand(10)

    plt.subplot(121)
    plt.plot(x,y)
    plt.subplot(122)        
    plt.plot(x,2*y)

    plt.draw()

    plt.pause(3)

しかし、それは機能しません(plt.figure各ループでGUIを開くように見えます。

このような解決策:

plt.ion()
fig, ax = plt.subplots(nrows=2, ncols=1)
plt.show()

while True:
    x=np.arange(10)
    y=np.random.rand(10)

    ax[0].plot(x,y)
    ax[1].plot(x,2*y)

    plt.draw()

    plt.pause(3)

はるかに効率的 (軸は 1 回だけ作成される) で、すっきり (最後に matplotlib は OO) であり、メモリ リークが発生しにくい可能性があります。

その上、あなたのほとんどから、各ループでファイルを再度読み込み、新しい行をプロットすることを収集します。このような場合は、再描画する前にまず軸の内容をクリアする必要があります。私の単純なケースでは、軸をクリアできます

for a in ax:
    a.clear()
于 2013-02-01T22:20:13.473 に答える