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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1360閲覧

jupyter python アニメーション 点と点を繋ぐ線の作成

rr9500sc

総合スコア16

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/24 23:56

編集2019/07/25 02:35

現在、jupyter notebookにて
アニメーションを作成中で、
下記のような3つの点が動くようなプログラムを組んでいます。

%matplotlib notebook %matplotlib nbagg import mpl_toolkits.mplot3d as plt3d from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import matplotlib.animation as animation from IPython.display import HTML import numpy as np def init(): ax.set_xlim(-10,10) ax.set_ylim(-10,10) ax.set_zlim(-10,10) ax.set_xlabel("x") ax.set_ylabel("y") ax.set_zlabel("z") ax.set_aspect('equal') return lines1,lines2,lines3 x1,y1,z1 = [],[],[] x2,y2,z2 = [],[],[] x3,y3,z3 = [],[],[] x1=[1,8,3,6,3,6,4] y1=[9,1,5,3,7,3,8] z1=[0,2,5,7,1,0,5] x2=[-1,-8,-3,-6,-3,-6,-4] y2=[-9,-1,-5,-3,-7,-3,-8] z2=[1,3,1,2,4,2,4] x3=[6,8,3,0,7,1,2] y3=[1,5,6,4,7,0,8] z3=[2,2,4,4,0,0,7] def update_lines(num,data1,data2,data3,lines1,lines2,lines3,points1,points2, points3): for dat1,dat2,dat3,line1,line2,line3,point1,point2, point3 in zip(data1,data2,data3,lines1,lines2,lines3,points1,points2, points3): point1.set_data(dat1[0:2, num+1]) point1.set_3d_properties(dat1[2, num+10]) point2.set_data(dat2[0:2, num+1]) point2.set_3d_properties(dat2[2, num+10]) point3.set_data(dat3[0:2, num+1]) point3.set_3d_properties(dat3[2, num+10]) return lines1,lines2,lines3, fig = plt.figure() ax = fig.gca(projection='3d') t = np.linspace(-3, 2, 30) z = np.linspace(-3, 2, 30) r = np.linspace(-3, 2, 30) x1, y1, z1 = x1, y1, z1 x2, y2, z2 = x2, y2, z2 x3, y3, z3 = x3, y3, z3 data1 = np.array([[x1,y1,z1]]) data2 = np.array([[x2,y2,z2]]) data3 = np.array([[x3,y3,z3]]) lines1=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1] )[0] for dat in data1] lines2=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1] )[0] for dat in data2] lines3=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1] )[0] for dat in data3] points1=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], 'o-')[0] for dat in data1] points2=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], 'o-')[0] for dat in data2] points3=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], 'o-')[0] for dat in data3] line_ani = animation.FuncAnimation(fig, update_lines, 172, fargs=(data1,data2,data3,lines1,lines2,lines3, points1,points2,points3), interval=10, init_func=init, blit=True, repeat=True,)

これらの点をそれぞれ
point1 - point2
point2 - point3

と常に線で繋がった状態で動くようにしたいです。

インターネットで検索した(主に静止画の)線を引くのコマンドや、
points3=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], 'o-')[0] for dat in data3]
のo-など、
試してみましたが成功しませんでした。
上記の試したコマンドのメモは残っていないです。申し訳ありません。

拙い文章ではありますがご回答のほど
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

-特定の点の間をつなぎたくない場合-

2種類のlines_p2p(点1~5を繋ぐ線と点6以降をつなぐ線)を作ることで対応できます。

python

1lines_p2p1=[0]*7 2lines_p2p2=[0]*7 3 4lines_p2p1[0],=ax.plot(datx[0,:6,0], daty[0,:6,0], datz[0,:6,0],color='red') 5lines_p2p2[0],=ax.plot(datx[0,6:,0], daty[0,6:,0], datz[0,6:,0],color='red') 6 7##update_lines関数内部 8 lines_p2p1[num].remove() 9  lines_p2p2[num].remove() 10 11 #新しく線(ax.plot())を作成する、最初の線と色を合わせる 12 lines_p2p1[num+1],=ax.plot(datx[0,:6,num+1], daty[0,:6,num+1], datz[0,:6,num+1],color='red') 13 lines_p2p2[num+1],=ax.plot(datx[0,6:,num+1], daty[0,6:,num+1], datz[0,6:,num+1],color='red') 14

pointsのようにset_dataでグラフを更新する方法だと上手くいかなかった(おそらく、3次元座標を扱うため)ので、「書いた線を消す→新しい線をプロットする」という愚直なアプローチで実装しました。

python

1#引数にdatx,daty,datz,lines_p2pを加える 2def update_lines(num,data1,data2,data3,lines1,lines2,lines3,points1,points2, points3,datx,daty,datz,lines_p2p): 3 4 for dat1,dat2,dat3,line1,line2,line3,point1,point2, point3 in zip(data1,data2,data3,lines1,lines2,lines3,points1,points2, points3): 5 point1.set_data(dat1[0:2, num+1]) 6 point1.set_3d_properties(dat1[2, num+1]) 7 point2.set_data(dat2[0:2, num+1]) 8 point2.set_3d_properties(dat2[2, num+1]) 9 point3.set_data(dat3[0:2, num+1]) 10 point3.set_3d_properties(dat3[2, num+1]) 11 12 #作った線を消す 13 lines_p2p[num].remove() 14 15 #新しく線(ax.plot())を作成する、最初の線と色を合わせる 16 lines_p2p[num+1],=ax.plot(datx[0,0:3,num+1], daty[0,0:3,num+1], datz[0,0:3,num+1],color='red') 17 18 return lines1,lines2,lines3, 19 20 21###中略(figの定義~points3の定義までそのまま)### 22 23 24#線を描写するための行列 25datx=np.array([[data1[0,0],data2[0,0],data3[0,0]]]) 26daty=np.array([[data1[0,1],data2[0,1],data3[0,1]]]) 27datz=np.array([[data1[0,2],data2[0,2],data3[0,2]]]) 28 29#ax.plot()を入れるためのリスト定義 30lines_p2p=[0]*7 31 32#線を作成 33 #datx[0,0:3,0]:線のx座標に関する列,[1 -1 6] 34 #daty[0,0:3,0]:線のy座標に関する列 35 #datz[0,0:3,0]:線のz座標に関する列 36 #デフォルトだと更新毎に線の色が変わってしまうため、色を指定 37lines_p2p[0],=ax.plot(datx[0,0:3,0], daty[0,0:3,0], datz[0,0:3,0],color='red') 38 39#fargsにdatx,daty,datz,lines_p2pを加える 40line_ani = animation.FuncAnimation(fig, update_lines, 172, fargs=(data1,data2,data3,lines1,lines2,lines3, points1,points2,points3,datx,daty,datz,lines_p2p), 41 interval=1000, init_func=init, blit=True, repeat=True,) 42

投稿2019/07/26 00:13

編集2019/07/26 04:23
amahara_waya

総合スコア1029

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

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

rr9500sc

2019/07/26 02:51

ご回答ありがとうございました。 思い通りのアニメーションを作ることが出来ました。 追加で質問なのですが 上記のプログラムだと一周目以降はで点が動くばかりで線が置いてけぼりになってしまうことへの 改善策を教えていただけたらと思っています。 よろしくお願いします。
rr9500sc

2019/07/26 03:21

重ねて申し訳ありません。 このまま点を4,5,6,7,。。。。と増やしていったとき、 5と6だけを繋ぎたくない等というのはこのプログラム上で可能なのでしょうか。 質問ばかりで申し訳ありませんがよろしくお願いします。
amahara_waya

2019/07/26 04:13

周回をこちらで再現できてないので推測になりますが、周回するタイミングで線の削除とlines_p2pの初期化(=[0]*7)を行えば対応できるんじゃないかと思います。 特定の点の間をつなぎたくない場合については、回答に追記します。
rr9500sc

2019/07/26 05:19

ありがとうございました! 周回の件の解決はまだですがそれ以外の問題については全て解決できました! またの機会がありましたら是非よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問