質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

9457閲覧

3次元散布図のアニメーションプロット

Penefax

総合スコア38

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

1クリップ

投稿2017/04/24 13:37

###前提・実現したいこと
Pythonで三次元散布図でのアニメーションを実装中に以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\matplotlib\backends\backend_qt5.py", line 427, in idle_draw
self.draw()
File "C:\Python27\lib\site-packages\matplotlib\backends\backend_qt5agg.py", line 148, in draw
FigureCanvasAgg.draw(self)
File "C:\Python27\lib\site-packages\matplotlib\backends\backend_agg.py", line 469, in draw
self.figure.draw(self.renderer)
File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\figure.py", line 1085, in draw
func(*args)
File "C:\Python27\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 276, in draw
Axes.draw(self, renderer)
File "C:\Python27\lib\site-packages\matplotlib\artist.py", line 59, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File "C:\Python27\lib\site-packages\matplotlib\axes_base.py", line 2110, in draw
a.draw(renderer)
File "C:\Python27\lib\site-packages\mpl_toolkits\mplot3d\art3d.py", line 125, in draw
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
File "C:\Python27\lib\site-packages\mpl_toolkits\mplot3d\proj3d.py", line 199, in proj_transform
return proj_transform_vec(vec, M)
File "C:\Python27\lib\site-packages\mpl_toolkits\mplot3d\proj3d.py", line 158, in proj_transform_vec
vecw = np.dot(M, vec)
TypeError: Cannot cast array data from dtype('float64') to dtype('S32') according to the rule 'safe'

###該当のソースコード
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig=plt.figure()
ax = Axes3D(fig)

def animate(i):
graph_data= open('example.txt','r').read()
lines = graph_data.split('\n')
xs=[]
ys=[]
zs=[]
for line in lines:
if len(line)>1:
x,y,z= line.split(',')
xs.append(x)
ys.append(y)
zs.append(z)
ax.cla()
ax.plot(xs,ys,zs,"o", color="#cccccc", ms=4, mew=0.5)

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

###試したこと
色々試した結果、x軸とy軸は対応した数字になりました。しかし、プロットは出ません。
z軸に関しては-0.06~0.06という特に指定してもいないのに座標が示されています。

###補足情報
Python2.7 spyder Python(x,y)インストール済み

example.txtには
1,5,6
2,3,2
3,4,4
と入れてあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず、FuncAnimationで指定されたanimate関数は、一定間隔で呼び出されます。
よって、この関数内では、すでに描画済みのデータ+新たに描画したい点を追加する処理が必要です。
また、Axes3Dグラフにおいては、軸の設定は毎回行わないといけないようです。(原因は未調査)

以下は、らせん状に点をプロットする例です。

Python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import matplotlib.animation as animation 4import math 5 6fig=plt.figure() 7ax = Axes3D(fig) 8 9x,y,z = [],[],[] # 描画データはグローバルに保持 10 11def animate(i): 12 print(i) # 0,1,2... 13 14 # 軸の設定(毎回行う必要ある?) 15 ax.cla() 16 ax.set_xlim(-20, 20) 17 ax.set_ylim(-20, 20) 18 ax.set_zlim(0, 50) 19 20 # 描画データを追加 螺旋状に 21 x.append(math.cos(i/2.0)*10) 22 y.append(math.sin(i/2.0)*10) 23 z.append(i) 24 25 # 描画 26 ax.plot( x, y, z,"o", color="#cccccc") 27 28# 1秒毎に描画 29ani =animation.FuncAnimation(fig, animate, interval=1000) 30plt.show()

投稿2017/04/24 14:23

can110

総合スコア38339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penefax

2017/04/25 01:02

ありがとうございます このコードを軸にcsvやtxtなどのテキストファイルを読み込んで表示させることは出来ないのでしょうか?
can110

2017/04/25 01:45

ざっとした流れですが - 最初「x,y,z = [],[],[]」の直下あたりで全データ読込。 - animate(i):の中で、読込データの先頭から順番に(=i番目を)x,y,zにappend で、できます。
guest

0

やろうとしていることは、こんな感じでしょうか?

出来るだけ質問に提示していただいたコードを真似て記述しております。

Python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import matplotlib.animation as animation 4 5# ファイル読み込み部を分離 6with open('example.txt','r') as f: 7 graph_data = f.read() 8 xs=[] 9 ys=[] 10 zs=[] 11 for line in graph_data.splitlines(): 12 if line: 13 x,y,z = line.split(',') 14 xs.append(float(x)) 15 ys.append(float(y)) 16 zs.append(float(z)) 17 18def animate(i, line): 19 line.set_data(xs[:i],ys[:i]) 20 line.set_3d_properties(zs[:i]) 21 return line 22 23fig=plt.figure() 24ax = Axes3D(fig) 25ax.cla() 26ln, = ax.plot([],[],[],"o", color="#cccccc", ms=4, mew=0.5) 27ax.set_xlim(min(xs)-1,max(xs)+1) 28ax.set_ylim(min(ys)-1,max(ys)+1) 29ax.set_zlim(min(zs)-1,max(zs)+1) 30ani = animation.FuncAnimation(fig, animate, len(xs)+1, fargs=(ln,), interval=1000) 31plt.show()

大きく変更したところは3点

  • データが文字列で格納されてたので、float型に修正
  • ファイルからのデータの読み込みは最初の1回だけにして、animate() 関数内ではデータを範囲指定で渡すように修正。
  • データの更新は Line3D.set_data()、Line3D.set_3d_properties() を使用する

こちら を参考にしております)

です。

あと、適当ですが範囲指定も追加しております。

投稿2017/04/25 02:14

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penefax

2017/04/25 14:22

ありがとうございます 回答の速さからcan110さんをBAにさせていただきましたが、magichanさんから頂いた意見も参考に今後も進めていきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問