質問するログイン新規登録

回答編集履歴

3

初期データと追加データを別に描画するように

2017/07/11 04:21

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  [matplotlibでリアルタイム描画](http://qiita.com/hausen6/items/b1b54f7325745ae43e47)
5
5
  [Python+Matplotlibでプロットアニメーションを作成する](http://qiita.com/wkentaro/items/128ceb1965731b6ef34c)
6
6
 
7
- 以下は3次元散布図に初期データを表示し、任意のタイミングで座標を追加し描画更新する例です。
7
+ 以下は3次元散布図に初期データを表示し、任意のタイミングで別データとして座標を追加し描画更新する例です。
8
8
  ```Python
9
9
  import numpy as np
10
10
  from matplotlib import pyplot as plt
@@ -24,8 +24,9 @@
24
24
  ax.set_zlim(-30, 20)
25
25
 
26
26
  # 最初に描画データを与えておく必要あり
27
- lines, = ax.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5)
27
+ l1, = ax.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5) # 初期データ用
28
+ l2, = ax.plot([0], [0], [0], "o", color="b", ms=8, mew=0.5) # 追加データ用 初回はダミーをセット
28
- return lines # 呼出元で利用
29
+ return l1,l2 # 呼出元で利用
29
30
 
30
31
  # グラフの描画更新
31
32
  def update_plot(lines,d):
@@ -39,21 +40,21 @@
39
40
  d = np.array([[-20,-30,-20],[20,-30,-20]])
40
41
 
41
42
  # グラフの初期化
42
- lines = init_plot(d)
43
+ l1,l2 = init_plot(d) # l1=初期データ, l2=追加データ用
43
- update_plot(lines,d)
44
+ update_plot(l1,d)
44
45
 
45
46
  time.sleep(1)
46
47
 
47
- # 新たな座標を追加し描画更新
48
+ # データ追加し描画更新
48
- d = np.vstack((d,[-20,10,0]))
49
+ a = np.array([[-20,10,0]]) # 追加データ
49
- update_plot(lines,d)
50
+ update_plot(l2,a)
50
51
 
51
52
  time.sleep(1)
52
53
 
53
54
  # ループで追加
54
55
  for i in range(0,10):
55
- d = np.vstack((d,[i,i,2*i]))
56
+ a = np.vstack((a,[i,i,2*i]))
56
- update_plot(lines,d)
57
+ update_plot(l2,a)
57
58
 
58
59
  time.sleep(0.5)
59
60
 

2

3次元散布図にコード変更

2017/07/11 04:21

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -1,53 +1,62 @@
1
1
  `plt.pause()`でリアルタイムに描画できるようです。
2
2
  以下のページに具体的なサンプルコードが載っています。
3
+ 参考:
3
- 参考:[matplotlibでリアルタイム描画](http://qiita.com/hausen6/items/b1b54f7325745ae43e47)
4
+ [matplotlibでリアルタイム描画](http://qiita.com/hausen6/items/b1b54f7325745ae43e47)
5
+ [Python+Matplotlibでプロットアニメーションを作成する](http://qiita.com/wkentaro/items/128ceb1965731b6ef34c)
4
6
 
5
- 以下は散布図に初期データを表示し、任意のタイミングで座標を追加し描画更新する例です。
7
+ 以下は3次元散布図に初期データを表示し、任意のタイミングで座標を追加し描画更新する例です。
6
8
  ```Python
7
9
  import numpy as np
8
- import matplotlib.pyplot as plt
10
+ from matplotlib import pyplot as plt
11
+ from mpl_toolkits.mplot3d.axes3d import Axes3D
9
12
  import time
10
13
 
11
14
  # グラフの初期化
12
15
  def init_plot(d):
13
- # 散布図
14
16
  fig = plt.figure()
15
- ax = fig.add_subplot(111)
17
+ ax = fig.add_subplot(111, projection='3d')
18
+
16
- ax.set_xlabel('X-axis')
19
+ ax.set_xlabel("X-axis")
17
- ax.set_ylabel('Y-axis')
20
+ ax.set_ylabel("Y-axis")
21
+ ax.set_zlabel("Z-axis")
18
22
  ax.set_xlim(-30, 30)
19
23
  ax.set_ylim(-40, 20)
20
- ax.grid(True)
24
+ ax.set_zlim(-30, 20)
21
25
 
22
26
  # 最初に描画データを与えておく必要あり
23
- lines, = ax.plot(d[:,0], d[:,1], "o", color="g", ms=24, mew=0.5)
27
+ lines, = ax.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5)
24
28
  return lines # 呼出元で利用
25
29
 
26
30
  # グラフの描画更新
27
31
  def update_plot(lines,d):
28
- lines.set_data(d[:,0],d[:,1])
32
+ lines.set_data(d[:,0],d[:,1]) # x,y
33
+ lines.set_3d_properties(d[:,2]) # z
29
34
  plt.pause(.01)
30
35
 
31
36
  if __name__ == "__main__":
37
+
32
38
  # 最初から表示するデータ
33
- d = np.array([[-20,-30,0],[20,-30,1]])
39
+ d = np.array([[-20,-30,-20],[20,-30,-20]])
34
40
 
35
- # グラフの初期表示
41
+ # グラフの初期
36
42
  lines = init_plot(d)
37
43
  update_plot(lines,d)
38
44
 
39
45
  time.sleep(1)
40
46
 
41
47
  # 新たな座標を追加して描画更新
42
- d = np.vstack((d,[-20,10,2]))
48
+ d = np.vstack((d,[-20,10,0]))
43
49
  update_plot(lines,d)
44
50
 
45
51
  time.sleep(1)
46
52
 
47
- # ループで追加&描画更新
53
+ # ループで追加
48
54
  for i in range(0,10):
49
- d = np.vstack((d,[i,i,i]))
55
+ d = np.vstack((d,[i,i,2*i]))
50
56
  update_plot(lines,d)
51
57
 
52
58
  time.sleep(0.5)
59
+
60
+ # 最後に確認表示できるように
61
+ plt.show()
53
62
  ```

1

サンプルコードを追加

2017/07/11 02:59

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -1,3 +1,53 @@
1
1
  `plt.pause()`でリアルタイムに描画できるようです。
2
2
  以下のページに具体的なサンプルコードが載っています。
3
- 参考:[matplotlibでリアルタイム描画](http://qiita.com/hausen6/items/b1b54f7325745ae43e47)
3
+ 参考:[matplotlibでリアルタイム描画](http://qiita.com/hausen6/items/b1b54f7325745ae43e47)
4
+
5
+ 以下は散布図に初期データを表示し、任意のタイミングで座標を追加し描画更新する例です。
6
+ ```Python
7
+ import numpy as np
8
+ import matplotlib.pyplot as plt
9
+ import time
10
+
11
+ # グラフの初期化
12
+ def init_plot(d):
13
+ # 散布図
14
+ fig = plt.figure()
15
+ ax = fig.add_subplot(111)
16
+ ax.set_xlabel('X-axis')
17
+ ax.set_ylabel('Y-axis')
18
+ ax.set_xlim(-30, 30)
19
+ ax.set_ylim(-40, 20)
20
+ ax.grid(True)
21
+
22
+ # 最初に描画データを与えておく必要あり
23
+ lines, = ax.plot(d[:,0], d[:,1], "o", color="g", ms=24, mew=0.5)
24
+ return lines # 呼出元で利用
25
+
26
+ # グラフの描画更新
27
+ def update_plot(lines,d):
28
+ lines.set_data(d[:,0],d[:,1])
29
+ plt.pause(.01)
30
+
31
+ if __name__ == "__main__":
32
+ # 最初から表示するデータ
33
+ d = np.array([[-20,-30,0],[20,-30,1]])
34
+
35
+ # グラフの初期表示
36
+ lines = init_plot(d)
37
+ update_plot(lines,d)
38
+
39
+ time.sleep(1)
40
+
41
+ # 新たな座標を追加して描画更新
42
+ d = np.vstack((d,[-20,10,2]))
43
+ update_plot(lines,d)
44
+
45
+ time.sleep(1)
46
+
47
+ # ループで追加&描画更新
48
+ for i in range(0,10):
49
+ d = np.vstack((d,[i,i,i]))
50
+ update_plot(lines,d)
51
+
52
+ time.sleep(0.5)
53
+ ```