回答編集履歴
4
d
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
|
-
f
|
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
|
31
|
+
def centroidal(vor, pts):
|
30
32
|
|
31
|
-
|
33
|
+
sq = Polygon([[0, 0], [1, 0], [1, 1], [0, 1]])
|
32
34
|
|
33
|
-
|
35
|
+
maxd = 0.0
|
34
36
|
|
35
|
-
|
37
|
+
for i in range(len(pts) - 3):
|
36
38
|
|
37
|
-
voronoi
|
39
|
+
poly = [vor.vertices[v] for v in vor.regions[vor.point_region[i]]]
|
38
40
|
|
39
|
-
|
41
|
+
i_cell = sq.intersection(Polygon(poly))
|
40
42
|
|
41
|
-
|
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=
|
113
|
+
anim = FuncAnimation(fig, plot, frames=process, save_count=n)
|
50
114
|
|
51
|
-
anim.save("animation.gif", writer="pillow"
|
115
|
+
anim.save("animation.gif", writer="pillow")
|
52
116
|
|
53
117
|
```
|
54
118
|
|
55
119
|
|
56
120
|
|
57
|
-
![イメージ説明](a8
|
121
|
+
![イメージ説明](0a841c3a68bd8d0c9d67165cd7d51150.gif)
|
3
d
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
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
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
|
-
|
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)
|