2017-11-20 10 views
0

私はテキストファイルからデータを取得し、matplotlibのanimation.FuncAnimationモジュールを使ってプロットしています。ここで私は実行を作るしようとしている私のコードは正しくMatplotlib FuncAnimationはx軸をプロットしません

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from matplotlib import style 

style.use('ggplot') 
fig = plt.figure() 
ax1 = fig.add_subplot(1,1,1) 

def animate(i): 
    graph_data = open('example.txt', 'r').read() 
    lines = graph_data.split('\n') 
    xs = [] 
    ys = [] 

    for line in lines: 
     x,y = line.split(',') 
     xs.append(x) 
     ys.append(y) 

    ax1.clear() 
    ax1.plot(xs, ys) 

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

example.txtには、私がしたいデータの(x、y)のペアが含まれている(スペースの都合のため省略)18行のテキストファイルですプロットするのが好きです。しかし、matplotlibはx値を順番にプロットしていません。つまり、10に達すると、1から2の間を挟むように折り返します。かなり悪いグラフになります。

私の実装で何が問題なのか把握するのに問題があります。私はそれらをプロットする前に値をソートしようとしましたが、プロットはまだ出ていますlike this

すべてのご協力ありがとうございます。私はドキュメントページとStackOverflowをしばらく見ていましたが、この同じ問題を抱えている人はいないようです。

+0

'example.txt'の外観はどうですか? 'x'と' y'座標はスペースかタブかコンマで区切られていますか?また、どのアニメーションを試していますか? 18ポイントを次々に表示したいですか? –

+0

データを数値に変換するのを忘れてしまった。現在の方法では、テキストファイルから文字列を読み込むので、プロットはアルファベット順に "1"、 "10"、 "100"、 "11"、 "110"、 "2"となります。また、 "1"は "100"から "10"、 "dog"から "cat"として "10"から離れていることにも注意してください。それは通常望ましくない。 'xs.append(float(x))'を使うか、それ以上に 'numpy.loadtxt'でファイルを読み込みます。 – ImportanceOfBeingErnest

+0

^これ!コースのありがとうございました。コメントを正解とするにはどうすればよいですか? – Joseph

答えて

0

クイックアンサー:以下の使用例。

注意すべき点がいくつかあります。 まず、FuncAnimationは、各呼び出しでanimateの機能を実行します。つまり、intervalミリ秒ごとです(この場合は1秒です)。あなたは本当に何度も何度も何度もファイルを読み込みたくはありません。一度やり直してからビューを更新してください。 第2に、軸(ax.plot)全体が非常に高価で、速く減速するたびに作成します。

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from matplotlib import style 


graph_data = open('example.txt', 'r').read() 
lines = graph_data.split('\n') 
xs = [] 
ys = [] 

for line in lines[:-1]: 
    x,y = line.split(',') 
    xs.append(float(x)) 
    ys.append(float(y)) 

# This is where you want to sort your data 
# sort(x, y, reference=x) # no such function 

style.use('ggplot') 
fig = plt.figure() 
ax1 = fig.add_subplot(1,1,1) 

x, y = [], [] # Prepare placeholders for animated data 
ln, = plt.plot(x, y, animated=True) 
ax1.set_xlim(min(xs), max(xs)) # Set xlim in advance 
ax1.set_ylim(min(ys), max(ys)) #  ylim 

def animate(i): 
    x.append(xs[i]) 
    y.append(ys[i]) 
    ln.set_data(x, y) 
    return ln, 

ani = animation.FuncAnimation(fig, animate, frames=range(len(xs)), 
           interval=1000, repeat=False, blit=True) 
plt.show() 

repeatフラグをFalseに設定したことに注目してください。これは、一度全体がframesリストを通過すると停止することを意味します。

+0

この回答の最初の文は間違っています。 Matplotlibは自動的に文字列をアルファベット順にソートします。これはいくつかの次のバージョンで修正される予定ですが、ここでの主なポイントはデータを文字列としてプロットしないことです。 – ImportanceOfBeingErnest

+0

なぜそれは並べ替えるのですか?それはxとyのリストのためにそれを独立して行うのですか? (私の答えは変更します) –

+0

はい、ソートは両方の軸に対して独立しています。カテゴリは 'numpy.unique'を通り、出力をソートします。しかし、主なポイントは、とにかく数値データに変換する必要があることです。あなたの答えはそれを行います( 'xs.append(float(x))')ので大丈夫です。 – ImportanceOfBeingErnest

関連する問題