回答編集履歴

4

d

2020/05/18 14:01

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,57 +1,121 @@
1
- FuncAnimation を使えば、アニメーション化できると思います。
1
+ [FuncAnimation](https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.animation.FuncAnimation.html) を使います。
2
2
 
3
3
 
4
4
 
5
5
 
6
6
 
7
+ 1. `frame` 引数には、ジェネレーターが指定できるので、各イテレーションごとの Voronoi オブジェクトを返すジェネレーターを指定する。
8
+
9
+ 2. `func` 引数に、受け取った Voronoi オブジェクトを描画する関数を指定する。
10
+
11
+
12
+
13
+ コードにすると以下のようになります。
14
+
15
+
16
+
7
17
  ```python
18
+
19
+ import random
8
20
 
9
21
  import matplotlib.pyplot as plt
10
22
 
11
- import numpy as np
12
-
13
- from matplotlib.animation import FuncAnimation
14
-
15
23
  from scipy.spatial import Voronoi, voronoi_plot_2d
16
24
 
17
-
18
-
19
- fig, ax = plt.subplots(figsize=(9, 7))
25
+ from shapely.geometry import Polygon, Point
20
-
21
-
22
-
23
- n = 100
24
26
 
25
27
 
26
28
 
27
29
 
28
30
 
29
- def plot(frame):
31
+ def centroidal(vor, pts):
30
32
 
31
- ax.cla() # Axes をクリアする
33
+ sq = Polygon([[0, 0], [1, 0], [1, 1], [0, 1]])
32
34
 
33
- points = np.random.rand(n, 2)
35
+ maxd = 0.0
34
36
 
35
- vor = Voronoi(points)
37
+ for i in range(len(pts) - 3):
36
38
 
37
- voronoi_plot_2d(vor, ax, show_vertices=False)
39
+ poly = [vor.vertices[v] for v in vor.regions[vor.point_region[i]]]
38
40
 
39
- ax.set_xlim(0, 1)
41
+ i_cell = sq.intersection(Polygon(poly))
40
42
 
41
- ax.set_ylim(0, 1)
43
+ p = Point(pts[i])
44
+
45
+ pts[i] = i_cell.centroid.coords[0]
46
+
47
+ d = p.distance(Point(pts[i]))
48
+
49
+ if maxd < d:
50
+
51
+ maxd = d
52
+
53
+ return maxd
42
54
 
43
55
 
44
56
 
45
57
 
46
58
 
59
+ def process():
60
+
61
+ d_threshold = 0.001
62
+
63
+
64
+
65
+ for i in range(100):
66
+
67
+ vor = Voronoi(pts)
68
+
69
+ d = centroidal(vor, pts)
70
+
71
+ if d < d_threshold:
72
+
73
+ break
74
+
75
+
76
+
77
+ yield vor
78
+
79
+
80
+
81
+
82
+
83
+ def plot(vor):
84
+
85
+ ax.cla()
86
+
87
+ voronoi_plot_2d(vor, ax=ax, show_vertices=False)
88
+
89
+ ax.set_aspect("equal")
90
+
91
+ ax.set_xlim([0, 1])
92
+
93
+ ax.set_ylim([0, 1])
94
+
95
+
96
+
97
+
98
+
99
+ n = 30
100
+
101
+ pts = [[random.random(), random.random()] for i in range(n)]
102
+
103
+ pts = pts + [[100, 100], [100, -100], [-100, 0]]
104
+
105
+
106
+
107
+ fig, ax = plt.subplots(figsize=(9, 9))
108
+
109
+
110
+
47
111
  # アニメーションを作成する。
48
112
 
49
- anim = FuncAnimation(fig, plot, frames=20)
113
+ anim = FuncAnimation(fig, plot, frames=process, save_count=n)
50
114
 
51
- anim.save("animation.gif", writer="pillow", fps=5)
115
+ anim.save("animation.gif", writer="pillow")
52
116
 
53
117
  ```
54
118
 
55
119
 
56
120
 
57
- ![イメージ説明](a80a4015d74bb4877e3096602c1e324c.gif)
121
+ ![イメージ説明](0a841c3a68bd8d0c9d67165cd7d51150.gif)

3

d

2020/05/18 14:01

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -51,3 +51,7 @@
51
51
  anim.save("animation.gif", writer="pillow", fps=5)
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ ![イメージ説明](a80a4015d74bb4877e3096602c1e324c.gif)

2

d

2020/05/18 13:21

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,5 +1,53 @@
1
- ----
1
+ FuncAnimation を使えば、アニメーション化できると思います。
2
2
 
3
3
 
4
4
 
5
+
6
+
7
+ ```python
8
+
9
+ import matplotlib.pyplot as plt
10
+
11
+ import numpy as np
12
+
13
+ from matplotlib.animation import FuncAnimation
14
+
15
+ from scipy.spatial import Voronoi, voronoi_plot_2d
16
+
17
+
18
+
5
- すいません。別の質問の回答と間違えて回答してしまったので書き直します。
19
+ fig, ax = plt.subplots(figsize=(9, 7))
20
+
21
+
22
+
23
+ n = 100
24
+
25
+
26
+
27
+
28
+
29
+ def plot(frame):
30
+
31
+ ax.cla() # Axes をクリアする
32
+
33
+ points = np.random.rand(n, 2)
34
+
35
+ vor = Voronoi(points)
36
+
37
+ voronoi_plot_2d(vor, ax, show_vertices=False)
38
+
39
+ ax.set_xlim(0, 1)
40
+
41
+ ax.set_ylim(0, 1)
42
+
43
+
44
+
45
+
46
+
47
+ # アニメーションを作成する。
48
+
49
+ anim = FuncAnimation(fig, plot, frames=20)
50
+
51
+ anim.save("animation.gif", writer="pillow", fps=5)
52
+
53
+ ```

1

d

2020/05/18 13:21

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,69 +1,5 @@
1
- 以下のような感じでどうでしょうか。
1
+ ----
2
-
3
- vmin, vmax を指定すると、カラーバーの範囲が [vmin, vmax] の範囲になるはずです。
4
2
 
5
3
 
6
4
 
7
- ```python
8
-
9
- import matplotlib.pyplot as plt
10
-
11
- import numpy as np
12
-
13
- from matplotlib.animation import FuncAnimation
14
-
15
-
16
-
17
- fig, ax = plt.subplots(figsize=(9, 7))
5
+ すいません。別の質問の回答と間違えて回答してしまったので書き直します。
18
-
19
-
20
-
21
- cbar_initialized = False # カラーバーを初期化したかどうか
22
-
23
-
24
-
25
-
26
-
27
- def plot(frame):
28
-
29
- global cbar_initialized
30
-
31
-
32
-
33
- ax.cla() # Axes をクリアする
34
-
35
-
36
-
37
- # pcolormesh を作成する。
38
-
39
- X, Y = np.mgrid[-10:11, -10:11]
40
-
41
- Z = np.random.randint(-15, 15, X.shape)
42
-
43
- mesh = ax.pcolormesh(X, Y, Z, cmap="jet", vmin=0, vmax=5)
44
-
45
-
46
-
47
- if not cbar_initialized:
48
-
49
- # カラーバーは1回だけ初期化する。
50
-
51
- cbar_initialized = True
52
-
53
- fig.colorbar(mesh, ax=ax)
54
-
55
-
56
-
57
-
58
-
59
- # アニメーションを作成する。
60
-
61
- anim = FuncAnimation(fig, plot, frames=20)
62
-
63
- anim.save("animation.gif", writer="pillow", fps=5)
64
-
65
- ```
66
-
67
-
68
-
69
- ![イメージ説明](84bc6c77ee4a64a287c456d91b1d9367.gif)