回答編集履歴

2

説明追加

2019/07/05 13:08

投稿

amahara_waya
amahara_waya

スコア1029

test CHANGED
@@ -1,3 +1,131 @@
1
+ -さらにコメントを受けて-
2
+
3
+
4
+
5
+ 返答遅くなりました。
6
+
7
+
8
+
9
+ fancanimation関数について調べたところ、参考記事にて、複数のグラフについてアニメーションを行う場合、プロットデータを別々に書くのがよろしいと書いてありました。
10
+
11
+
12
+
13
+ 参考記事:[matplotlibで複数のグラフをアニメーションさせる](https://qiita.com/taroc/items/da583655f89cb61a0c93)
14
+
15
+
16
+
17
+ 今回の場合、以下のようなコードにするとよいかと思います。一応アニメーション動作確認済みです。
18
+
19
+
20
+
21
+ ```python
22
+
23
+
24
+
25
+ (前略)
26
+
27
+
28
+
29
+ def update_lines(num,data1,data2,lines1,lines2, points1,points2):
30
+
31
+ for dat1,dat2,line1,line2,point1, point2 in zip(data1,data2,lines1,lines2, points1,points2):
32
+
33
+ point1.set_data(dat1[0:2, num+1])
34
+
35
+ point1.set_3d_properties(dat1[2, num+1])
36
+
37
+ point2.set_data(dat2[0:2, num+1])
38
+
39
+ point2.set_3d_properties(dat2[2, num+1])
40
+
41
+
42
+
43
+ #下記コードのように分割して書いても可能
44
+
45
+ # for dat1,line1,point1 in zip(data1,lines1, points1):
46
+
47
+ # point1.set_data(dat1[0:2, num+1])
48
+
49
+ # point1.set_3d_properties(dat1[2, num+1])
50
+
51
+ # for dat2,line2,point2 in zip(data2,lines2, points2):
52
+
53
+ # point2.set_data(dat2[0:2, num+1])
54
+
55
+ # point2.set_3d_properties(dat2[2, num+1])
56
+
57
+
58
+
59
+ return lines1,lines2
60
+
61
+
62
+
63
+ # Attaching 3D axis to the figure
64
+
65
+ fig = plt.figure()
66
+
67
+ ax = fig.gca(projection='3d')
68
+
69
+
70
+
71
+ # Lines to plot in 3D
72
+
73
+ t = np.linspace(-3, 2, 30)
74
+
75
+ z = np.linspace(-3, 2, 30)
76
+
77
+ r = np.linspace(-3, 2, 30)
78
+
79
+
80
+
81
+ #data,lines,pointsについてそれぞれ定義する
82
+
83
+ x1, y1, z1 = x1, y1, z1
84
+
85
+ x2, y2, z2 = x2, y2, z2
86
+
87
+
88
+
89
+ data1 = np.array([[x1,y1,z1]])
90
+
91
+ data2 = np.array([[x2,y2,z2]])
92
+
93
+
94
+
95
+ lines1=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1] )[0] for dat in data1]
96
+
97
+ lines2=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1] )[0] for dat in data2]
98
+
99
+
100
+
101
+ points1=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], 'o')[0] for dat in data1]
102
+
103
+ points2=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], 'o')[0] for dat in data2]
104
+
105
+
106
+
107
+ #アニメーション
108
+
109
+ line_ani = animation.FuncAnimation(fig, update_lines, 300, fargs=(data1,data2,lines1,lines2, points1,points2),
110
+
111
+ interval=1000, init_func=init, blit=True, repeat=True)
112
+
113
+ ```
114
+
115
+
116
+
117
+ 動作確認・ご検討よろしくおねがいします。
118
+
119
+
120
+
121
+ ---
122
+
123
+
124
+
125
+
126
+
127
+
128
+
1
129
  -コメントを受けて-
2
130
 
3
131
 

1

コードの追記

2019/07/05 13:08

投稿

amahara_waya
amahara_waya

スコア1029

test CHANGED
@@ -1,3 +1,109 @@
1
+ -コメントを受けて-
2
+
3
+
4
+
5
+ こちらが提案したコードの問題でしょう。割とこちらも模索してる状態なので…申し訳ないです。
6
+
7
+
8
+
9
+ 現状思いつく改善案を2つ上げておきます。
10
+
11
+
12
+
13
+ ```python
14
+
15
+ #改善案1
16
+
17
+ #処理順を考えると点1が動いてから点2が動く、という要望とは少し違う動作になる可能性が高い
18
+
19
+
20
+
21
+ x1, y1, z1 = x1, y1, z1
22
+
23
+ datas=[]
24
+
25
+ #変数名の重複を防ぐためdataからdatapに変更
26
+
27
+ datap = np.array([[x1,y1,z1]])
28
+
29
+ datas.append(datap)
30
+
31
+ x2, y2, z2 = x2, y2, z2
32
+
33
+ #同様にdatapに変更
34
+
35
+ datap = np.array([[x2,y2,z2]])
36
+
37
+ datas.append(datap)
38
+
39
+
40
+
41
+ lines=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1] )[0] for dat in data for data in datas]#2重のfor文に変える
42
+
43
+ points=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], 'o')[0] for dat in data for data in datas]
44
+
45
+
46
+
47
+ for data in datas:
48
+
49
+ line_ani = animation.FuncAnimation(fig, update_lines, 300, fargs=(data,lines, points),
50
+
51
+ interval=10, init_func=init, blit=True, repeat=True)
52
+
53
+ ```
54
+
55
+
56
+
57
+
58
+
59
+ ```python
60
+
61
+ #改善案2
62
+
63
+ #2点を同時に移動させたい、がうまく動作しないかもしれない
64
+
65
+
66
+
67
+ def update_lines(num, datas, lines,points):
68
+
69
+ for data in datas:
70
+
71
+ for dat,line, point in zip(data,lines, points):
72
+
73
+ point.set_data(dat[0:2, num+1])
74
+
75
+ point.set_3d_properties(dat[2, num+1])
76
+
77
+
78
+
79
+ return lines
80
+
81
+
82
+
83
+ #中略
84
+
85
+
86
+
87
+ line_ani = animation.FuncAnimation(fig, update_lines, 300, fargs=(datas,lines, points),
88
+
89
+ interval=10, init_func=init, blit=True, repeat=True)
90
+
91
+ ```
92
+
93
+
94
+
95
+ 動作確認・ご検討よろしくおねがいします。
96
+
97
+
98
+
99
+ -追記終わり-
100
+
101
+
102
+
103
+ ---
104
+
105
+
106
+
1
107
  追記部分に関する回答になります。
2
108
 
3
109
 
@@ -8,19 +114,23 @@
8
114
 
9
115
  ```ここに言語を入力
10
116
 
117
+
118
+
119
+
120
+
11
121
  x1, y1, z1 = x1, y1, z1
12
122
 
13
123
  datas=[]#データリスト
14
124
 
15
- data = np.array([[x1,y1,z1]])#プロットするデータ
125
+ datap = np.array([[x1,y1,z1]])#プロットするデータ
16
126
 
17
- datas.append(data)#データをリストに入れる
127
+ datas.append(datap)#データをリストに入れる
18
128
 
19
129
  x2, y2, z2 = x2, y2, z2#プロットするデータ
20
130
 
21
- data = np.array([[x2,y2,z2]])#プロットするデータ
131
+ datap = np.array([[x2,y2,z2]])#プロットするデータ
22
132
 
23
- datas.append(data)
133
+ datas.append(datap)
24
134
 
25
135
 
26
136
 
@@ -28,6 +138,10 @@
28
138
 
29
139
  points=[ax.plot(dat[0, 0:1], dat[1, 0:1], dat[2, 0:1], 'o')[0] for dat in data for data in datas]
30
140
 
141
+
142
+
143
+
144
+
31
145
  ```
32
146
 
33
147