2017-05-22 17 views
2

私はPythonとMatplotlibを使って簡単なアニメーションを作成しています。 私のコードは以下の通りです:Python、matplotlibのアニメーションと破線の衝突

import matplotlib 
#matplotlib.use('TkAgg') 
from matplotlib import animation as animation 
from matplotlib import pyplot as plt 
import numpy as np 


def w(q): return np.exp(-q**2) 

support_q = np.linspace(-10,10,200) 
support_q1 = np.linspace(-10,10,30) 

list_w = [[w(q-q1) for q in support_q] for q1 in support_q1] 


fig = plt.figure() 
ax = fig.add_subplot(111, xlabel='q', ylabel='w(q-q\')') 
line_w, = ax.plot(support_q, list_w[0]) 
plt.axhline(dashes=[10], zorder=0) 
ax.xaxis.major.locator.set_params(nbins=12) 
ax.yaxis.major.locator.set_params(nbins=5) 


def animate(i): 
    line_w.set_ydata(list_w[i]) 
    return line_w, 

anim = animation.FuncAnimation(fig, animate, frames=len(support_q1), interval=10, blit=False) 
#anim.save('animation.mp4') 
plt.show() 

コードがスムーズに実行され、私が欲しいのアニメーションを生成します。しかし、私はちょうどアニメーションを表示する前に保存コマンドanim.save('animation.mp4')が含まれている場合、私は次のエラーコードを取得する:

File "/Users/usr1/Library/Python/3.5/lib/python/site-packages/matplotlib/backends/backend_agg.py", line 166, in draw_path 
self._renderer.draw_path(gc, path, transform, rgbFace) 
ValueError: dashes sequence must have an even number of elements 

私は正確に同じエラーが発生したのMac OS Xを使用していますが、私はアニメーションを保存する場合は代わりに複製されていますバックエンドをTkAgg(matplotlib.use('TkAgg')を使用)に変更してみてください。 FuncAnimationhere参照)にblit=Trueオプションを使用したいが、このエラーのために実装することができないMacユーザーの場合、バックエンドを変更することは回避策です。

プロットに破線の軸が追加されていることから問題が発生していることがわかりました。つまり、私が行を削除すると、

plt.axhline(color='k', dashes=[10], zorder=0) 

問題は消滅し、ValueErrorはありません。

何が起こっているのか考えている人はいますか?アニメーションモジュールは破線を処理できませんか?

答えて

0

TkAggとQt4Aggでは、アニメーションをまったく使用しなくてもエラーを再現できます。その理由は、確かに我々はdashes

はセット[S]ダッシュ系列、ポイントのオフインク上でのダッシュのシーケンスことを学ぶthe documentationからライン

plt.axhline(dashes=[10]) 

です。 seqが空の場合、またはseq =(None、None)の場合、linestyleはsolidに設定されます。

[10]は「オン」のシーケンスではなく「オン」のシーケンスであることが明らかです。有効なシーケンスには、少なくとも2つの数字が含まれます。

実際、有効なシーケンスを使用すると、

plt.axhline(dashes=[10,3]) 

すべてが問題なく実行されます。

関連する問題