質問編集履歴

4

やりたい事を書きました。

2021/12/24 19:55

投稿

amunagan
amunagan

スコア22

test CHANGED
File without changes
test CHANGED
@@ -37,3 +37,11 @@
37
37
 
38
38
 
39
39
  これ点滅しちゃうのはしょうがないんですかね?0.05の数値下げるぐらいしか?
40
+
41
+
42
+
43
+ 次にやりたいこととしては、
44
+
45
+ ・背景に画像を置きたい
46
+
47
+ ggplot2のggplotを使うんだと思うのですが・・・どう書けば良いのでしょうか・・・。

3

進捗を書きました。

2021/12/24 19:54

投稿

amunagan
amunagan

スコア22

test CHANGED
File without changes
test CHANGED
@@ -4,29 +4,21 @@
4
4
 
5
5
 
6
6
 
7
- https://mickey24.hatenablog.com/entry/20090614/1244965434
8
-
9
-
10
-
11
- ここにある
7
+ とりあえうここまでやってみた。
12
8
 
13
9
 
14
10
 
15
11
  ```R
16
12
 
17
- library(animation)
18
-
19
-
20
-
21
13
  wave <- function() {
22
14
 
23
- for(t in 1:100) {
15
+ for(t in 1:30) {
24
16
 
25
- plot(function(x){ sin(x + 0.08 * pi * t) },
17
+ plot(3*t+10, 3*t+15, pch = "a", xlim=c(0, 100), ylim=c(0, 100), xaxt="n", yaxt="n", xlab = "", ylab = "", bty="n")
26
18
 
27
- -pi, 2*pi, xlab="x", ylab="sin(x)",
19
+ plot(3*t-10, 3*t+5, pch = "b", xlim=c(0, 100), ylim=c(0, 100), xaxt="n", yaxt="n", xlab = "", ylab = "", bty="n")
28
20
 
29
- col="blue", lwd=3)
21
+ plot(3*t, 3*t, pch = "c", xlim=c(0, 100), ylim=c(0, 100), xaxt="n", yaxt="n", xlab = "", ylab = "", bty="n")
30
22
 
31
23
  }
32
24
 
@@ -34,478 +26,14 @@
34
26
 
35
27
 
36
28
 
37
- saveMovie(wave(), interval=0.05, moviename="wave",
29
+ saveGIF(wave(), interval=0.05, moviename="wave",
38
30
 
39
31
  movietype="gif", outdir=getwd(),
40
32
 
41
- width=640, height=480)
33
+ width=640, height=480, movie.name = "TEST.gif")
42
34
 
43
35
  ```
44
36
 
45
37
 
46
38
 
47
- この方法あれば、連続して変化する関数の様子がgif動画とて描れますが、
39
+ れ点滅しちゃうはしょうがないんですかね?0.05の数値下げぐらいしか
48
-
49
- 点(ただの点でなくアルファベットが好ましい)の動きではありません。
50
-
51
-
52
-
53
- あと、以前適当に、別サイト参考に作ったやつがあるのですが、
54
-
55
-
56
-
57
- ```R
58
-
59
- library(tidyverse)
60
-
61
- ## Warning: パッケージ 'tidyverse' はバージョン 3.5.3 の R の下で造られました
62
-
63
- ## -- Attaching packages --------------------------------------- tidyverse 1.2.1 --
64
-
65
- ## √ ggplot2 3.1.0 √ purrr 0.2.5
66
-
67
- ## √ tibble 2.1.3 √ dplyr 0.8.5
68
-
69
- ## √ tidyr 1.0.0 √ stringr 1.3.1
70
-
71
- ## √ readr 1.2.1 √ forcats 0.3.0
72
-
73
- ## Warning: パッケージ 'ggplot2' はバージョン 3.5.1 の R の下で造られました
74
-
75
- ## Warning: パッケージ 'tibble' はバージョン 3.5.3 の R の下で造られました
76
-
77
- ## Warning: パッケージ 'tidyr' はバージョン 3.5.3 の R の下で造られました
78
-
79
- ## Warning: パッケージ 'readr' はバージョン 3.5.1 の R の下で造られました
80
-
81
- ## Warning: パッケージ 'dplyr' はバージョン 3.5.3 の R の下で造られました
82
-
83
- ## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
84
-
85
- ## x dplyr::filter() masks stats::filter()
86
-
87
- ## x dplyr::lag() masks stats::lag()
88
-
89
-
90
-
91
- reset_df <- function(){
92
-
93
- df <- tibble(
94
-
95
- v0 = 20, #initial velocity
96
-
97
- theta = -1, #angle in radians
98
-
99
- # gravity変更済み
100
-
101
- gravity = 1, #this is just picked for the sclale
102
-
103
- adj = 0, #used in the bouncing effect
104
-
105
- decay = 0.8, #the bounciness of the ball
106
-
107
- color = "steelblue", #color of the ball
108
-
109
- cex = 2, #size of the ball
110
-
111
- t = 0, #time position of this ball
112
-
113
- xpos = 0, #current x position (will be updated)
114
-
115
- ypos = 0, #current y position (will be updated)
116
-
117
- )
118
-
119
- return(df)
120
-
121
- }
122
-
123
-
124
-
125
- generate_picture <- function(df, xrange = 1200, yrange = 900){
126
-
127
-
128
-
129
- range_xy_ratio <- xrange/yrange
130
-
131
-
132
-
133
- gg <- ggplot(df) +
134
-
135
- geom_point(aes(x = xpos, y = ypos, color = color, size = cex)) +
136
-
137
- labs(x = NULL, y = NULL) +
138
-
139
- scale_x_continuous(breaks = NULL, minor_breaks = NULL) +
140
-
141
- scale_y_continuous(breaks = NULL, minor_breaks = NULL) +
142
-
143
- theme(legend.position = "none",
144
-
145
- panel.background = element_rect(fill = "white", colour = "white")) +
146
-
147
- coord_cartesian(xlim = c(0,xrange), ylim = c(0,yrange)) +
148
-
149
- annotate("text", x=50, y=500, parse=TRUE,label="ああああああああああああ") +
150
-
151
- annotate("segment", x=170,xend=530, y=500,yend=450,colour="red", size=7, alpha = 0.1) +
152
-
153
- annotate("segment", x=530,xend=1030, y=450,yend=500,colour="red", size=7, alpha = 0.1) +
154
-
155
- annotate("segment", x=170,xend=530, y=430,yend=400,colour="red", size=7, alpha = 0.1) +
156
-
157
- annotate("segment", x=530,xend=1030, y=400,yend=430,colour="red", size=7, alpha = 0.1) +
158
-
159
- annotate("segment", x=0,xend=250, y=1000,yend=500,colour="blue", size=10, alpha = 0.1) +
160
-
161
- annotate("segment", x=30,xend=250, y=0,yend=100,colour="blue", size=10, alpha = 0.1) +
162
-
163
- annotate("segment", x=450,xend=620, y=480,yend=600,colour="blue", size=10, alpha = 0.1) +
164
-
165
- annotate("segment", x=170,xend=1030, y=600,yend=600,colour="blue", size=10, alpha = 0.1) +
166
-
167
- annotate("segment", x=400,xend=650, y=650,yend=500,colour="red", size=10, alpha = 0.1) +
168
-
169
- annotate("segment", x=400,xend=700, y=650,yend=700,colour="red", size=13, alpha = 0.1) +
170
-
171
- annotate("segment", x=700,xend=850, y=700,yend=400,colour="red", size=13, alpha = 0.1) +
172
-
173
- annotate("segment", x=500,xend=450, y=680,yend=800,colour="red", size=10, alpha = 0.1) +
174
-
175
- annotate("segment", x=580,xend=530, y=680,yend=800,colour="red", size=10, alpha = 0.1) +
176
-
177
- annotate("segment", x=660,xend=610, y=680,yend=800,colour="red", size=10, alpha = 0.1) +
178
-
179
- annotate("rect", xmin=250, xmax=900, ymin=100, ymax=500,colour="pink",fill="pink", alpha = 0.9) +
180
-
181
- annotate("segment", x=550,xend=550, y=100,yend=500,colour="red", size=20, alpha = 0.1)
182
-
183
- return(gg)
184
-
185
- }
186
-
187
-
188
-
189
- generate_picture(df)
190
-
191
-
192
-
193
- df <- reset_df()
194
-
195
-
196
-
197
- simulate_ball <- function(df, time_lapse=0.3){
198
-
199
- #new t value
200
-
201
- df <- df %>% mutate(t = t + time_lapse)
202
-
203
-
204
-
205
- #calculate new position
206
-
207
- if(df$t<30){
208
-
209
- df <- df %>%
210
-
211
- mutate(
212
-
213
- # ypos = v0 * t * sin(theta) - (gravity * t^2)
214
-
215
- ypos = v0 * t/2 * sin(theta) - (gravity * t^2) +950,
216
-
217
- xpos = v0 * t * cos(theta) + adj
218
-
219
- )
220
-
221
- }else{
222
-
223
- df <- df %>%
224
-
225
- mutate(
226
-
227
- # ypos = v0 * t * sin(theta) - (gravity * t^2)
228
-
229
- ypos = v0 * t/2 * sin(theta) + (gravity * t^2) +950,
230
-
231
- xpos = v0 * t * cos(theta) + adj
232
-
233
- )
234
-
235
- }
236
-
237
-
238
-
239
- # check for anything bouncing
240
-
241
- for (x in seq(nrow(df))) {
242
-
243
- if (df$ypos[x] < 0) {
244
-
245
- # reset the bounce
246
-
247
- df$adj[x] <- df$xpos[x]
248
-
249
- df$v0[x] <- df$v0[x] * df$decay[x]
250
-
251
- df$t[x] <- -time_lapse
252
-
253
- }
254
-
255
- }
256
-
257
- # if stuck, settle it.
258
-
259
- df$v0 <- ifelse(df$v0 < 0.01, 0, df$v0)
260
-
261
- df$t <- df$t + time_lapse
262
-
263
-
264
-
265
- return(df)
266
-
267
- }
268
-
269
-
270
-
271
- for(i in 1:5){
272
-
273
- print(i)
274
-
275
- df <- df %>% simulate_ball(.,time_lapse = 0.3)
276
-
277
- generate_picture(df) %>% print()
278
-
279
- }
280
-
281
-
282
-
283
- av::av_capture_graphics(expr = {
284
-
285
- df <- reset_df()
286
-
287
- #1:280が初期値
288
-
289
- for(i in 1:100){
290
-
291
- print(i)
292
-
293
- df <- df %>% simulate_ball(.,time_lapse = 0.3)
294
-
295
- generate_picture(df) %>% print()
296
-
297
- }
298
-
299
- }, output = "boundballwithlines2.mp4", framerate = 40)
300
-
301
- ```
302
-
303
- これは、画像が大量生成されてしまい、重く、かつアルファベットでなくボールであり、かつgif動画にならず、なんか仰々しくて扱いずらく感じ、もっとシンプルにできると思っています。
304
-
305
-
306
-
307
- どのようにすれば良いのでしょうか。
308
-
309
-
310
-
311
- てか、gifにするには最後のファイル形式を変えるだけでいいんですね、
312
-
313
- 画像生成しないパターンなら、別サイトのをほぼそのままで・・・
314
-
315
-
316
-
317
- ```R
318
-
319
- library(tidyverse)
320
-
321
- ## Warning: パッケージ 'tidyverse' はバージョン 3.5.3 の R の下で造られました
322
-
323
- ## -- Attaching packages --------------------------------------- tidyverse 1.2.1 --
324
-
325
- ## √ ggplot2 3.1.0 √ purrr 0.2.5
326
-
327
- ## √ tibble 2.1.3 √ dplyr 0.8.5
328
-
329
- ## √ tidyr 1.0.0 √ stringr 1.3.1
330
-
331
- ## √ readr 1.2.1 √ forcats 0.3.0
332
-
333
- ## Warning: パッケージ 'ggplot2' はバージョン 3.5.1 の R の下で造られました
334
-
335
- ## Warning: パッケージ 'tibble' はバージョン 3.5.3 の R の下で造られました
336
-
337
- ## Warning: パッケージ 'tidyr' はバージョン 3.5.3 の R の下で造られました
338
-
339
- ## Warning: パッケージ 'readr' はバージョン 3.5.1 の R の下で造られました
340
-
341
- ## Warning: パッケージ 'dplyr' はバージョン 3.5.3 の R の下で造られました
342
-
343
- ## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
344
-
345
- ## x dplyr::filter() masks stats::filter()
346
-
347
- ## x dplyr::lag() masks stats::lag()
348
-
349
- reset_df <- function(){
350
-
351
- df <- tibble(
352
-
353
- v0 = 100, #initial velocity
354
-
355
- theta = 1.4, #angle in radians
356
-
357
- gravity = 5, #this is just picked for the sclale
358
-
359
- adj = 0, #used in the bouncing effect
360
-
361
- decay = 0.8, #the bounciness of the ball
362
-
363
- color = "steelblue", #color of the ball
364
-
365
- cex = 2, #size of the ball
366
-
367
- t = 0, #time position of this ball
368
-
369
- xpos = 0, #current x position (will be updated)
370
-
371
- ypos = 0, #current y position (will be updated)
372
-
373
- )
374
-
375
- return(df)
376
-
377
- }
378
-
379
-
380
-
381
-
382
-
383
- generate_picture <- function(df, xrange = 1200, yrange = 900){
384
-
385
-
386
-
387
- range_xy_ratio <- xrange/yrange
388
-
389
-
390
-
391
- gg <- ggplot(df) +
392
-
393
- geom_point(aes(x = xpos, y = ypos, color = color, size = cex)) +
394
-
395
- labs(x = NULL, y = NULL) +
396
-
397
- scale_x_continuous(breaks = NULL, minor_breaks = NULL) +
398
-
399
- scale_y_continuous(breaks = NULL, minor_breaks = NULL) +
400
-
401
- theme(legend.position = "none",
402
-
403
- panel.background = element_rect(fill = "white", colour = "white")) +
404
-
405
- coord_cartesian(xlim = c(0,xrange), ylim = c(0,yrange))
406
-
407
-
408
-
409
- return(gg)
410
-
411
- }
412
-
413
-
414
-
415
-
416
-
417
- generate_picture(df)
418
-
419
-
420
-
421
- df <- reset_df()
422
-
423
-
424
-
425
- simulate_ball <- function(df, time_lapse=0.3){
426
-
427
- #new t value
428
-
429
- df <- df %>% mutate(t = t + time_lapse)
430
-
431
-
432
-
433
- #calculate new position
434
-
435
- df <- df %>%
436
-
437
- mutate(
438
-
439
- ypos = v0 * t * sin(theta) - (gravity * t^2),
440
-
441
- xpos = v0 * t * cos(theta) + adj
442
-
443
- )
444
-
445
-
446
-
447
- # check for anything bouncing
448
-
449
- for (x in seq(nrow(df))) {
450
-
451
- if (df$ypos[x] < 0) {
452
-
453
- # reset the bounce
454
-
455
- df$adj[x] <- df$xpos[x]
456
-
457
- df$v0[x] <- df$v0[x] * df$decay[x]
458
-
459
- df$t[x] <- -time_lapse
460
-
461
- }
462
-
463
- }
464
-
465
- # if stuck, settle it.
466
-
467
- df$v0 <- ifelse(df$v0 < 0.01, 0, df$v0)
468
-
469
- df$t <- df$t + time_lapse
470
-
471
-
472
-
473
- return(df)
474
-
475
- }
476
-
477
-
478
-
479
- for(i in 1:5){
480
-
481
- print(i)
482
-
483
- df <- df %>% simulate_ball(.,time_lapse = 0.3)
484
-
485
- generate_picture(df) %>% print()
486
-
487
- }
488
-
489
-
490
-
491
- av::av_capture_graphics(expr = {
492
-
493
- df <- reset_df()
494
-
495
- for(i in 1:280){
496
-
497
- print(i)
498
-
499
- df <- df %>% simulate_ball(.,time_lapse = 0.3)
500
-
501
- generate_picture(df) %>% print()
502
-
503
- }
504
-
505
- }, output = "test2.gif", framerate = 40)
506
-
507
- ```
508
-
509
- このようにしたらできますが・・・あとはボールをアルファベットに変え、
510
-
511
- ボール数を増やし、かつ背景をつけたいが・・・。

2

一部進展。

2021/12/24 19:26

投稿

amunagan
amunagan

スコア22

test CHANGED
File without changes
test CHANGED
@@ -305,3 +305,207 @@
305
305
 
306
306
 
307
307
  どのようにすれば良いのでしょうか。
308
+
309
+
310
+
311
+ てか、gifにするには最後のファイル形式を変えるだけでいいんですね、
312
+
313
+ 画像生成しないパターンなら、別サイトのをほぼそのままで・・・
314
+
315
+
316
+
317
+ ```R
318
+
319
+ library(tidyverse)
320
+
321
+ ## Warning: パッケージ 'tidyverse' はバージョン 3.5.3 の R の下で造られました
322
+
323
+ ## -- Attaching packages --------------------------------------- tidyverse 1.2.1 --
324
+
325
+ ## √ ggplot2 3.1.0 √ purrr 0.2.5
326
+
327
+ ## √ tibble 2.1.3 √ dplyr 0.8.5
328
+
329
+ ## √ tidyr 1.0.0 √ stringr 1.3.1
330
+
331
+ ## √ readr 1.2.1 √ forcats 0.3.0
332
+
333
+ ## Warning: パッケージ 'ggplot2' はバージョン 3.5.1 の R の下で造られました
334
+
335
+ ## Warning: パッケージ 'tibble' はバージョン 3.5.3 の R の下で造られました
336
+
337
+ ## Warning: パッケージ 'tidyr' はバージョン 3.5.3 の R の下で造られました
338
+
339
+ ## Warning: パッケージ 'readr' はバージョン 3.5.1 の R の下で造られました
340
+
341
+ ## Warning: パッケージ 'dplyr' はバージョン 3.5.3 の R の下で造られました
342
+
343
+ ## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
344
+
345
+ ## x dplyr::filter() masks stats::filter()
346
+
347
+ ## x dplyr::lag() masks stats::lag()
348
+
349
+ reset_df <- function(){
350
+
351
+ df <- tibble(
352
+
353
+ v0 = 100, #initial velocity
354
+
355
+ theta = 1.4, #angle in radians
356
+
357
+ gravity = 5, #this is just picked for the sclale
358
+
359
+ adj = 0, #used in the bouncing effect
360
+
361
+ decay = 0.8, #the bounciness of the ball
362
+
363
+ color = "steelblue", #color of the ball
364
+
365
+ cex = 2, #size of the ball
366
+
367
+ t = 0, #time position of this ball
368
+
369
+ xpos = 0, #current x position (will be updated)
370
+
371
+ ypos = 0, #current y position (will be updated)
372
+
373
+ )
374
+
375
+ return(df)
376
+
377
+ }
378
+
379
+
380
+
381
+
382
+
383
+ generate_picture <- function(df, xrange = 1200, yrange = 900){
384
+
385
+
386
+
387
+ range_xy_ratio <- xrange/yrange
388
+
389
+
390
+
391
+ gg <- ggplot(df) +
392
+
393
+ geom_point(aes(x = xpos, y = ypos, color = color, size = cex)) +
394
+
395
+ labs(x = NULL, y = NULL) +
396
+
397
+ scale_x_continuous(breaks = NULL, minor_breaks = NULL) +
398
+
399
+ scale_y_continuous(breaks = NULL, minor_breaks = NULL) +
400
+
401
+ theme(legend.position = "none",
402
+
403
+ panel.background = element_rect(fill = "white", colour = "white")) +
404
+
405
+ coord_cartesian(xlim = c(0,xrange), ylim = c(0,yrange))
406
+
407
+
408
+
409
+ return(gg)
410
+
411
+ }
412
+
413
+
414
+
415
+
416
+
417
+ generate_picture(df)
418
+
419
+
420
+
421
+ df <- reset_df()
422
+
423
+
424
+
425
+ simulate_ball <- function(df, time_lapse=0.3){
426
+
427
+ #new t value
428
+
429
+ df <- df %>% mutate(t = t + time_lapse)
430
+
431
+
432
+
433
+ #calculate new position
434
+
435
+ df <- df %>%
436
+
437
+ mutate(
438
+
439
+ ypos = v0 * t * sin(theta) - (gravity * t^2),
440
+
441
+ xpos = v0 * t * cos(theta) + adj
442
+
443
+ )
444
+
445
+
446
+
447
+ # check for anything bouncing
448
+
449
+ for (x in seq(nrow(df))) {
450
+
451
+ if (df$ypos[x] < 0) {
452
+
453
+ # reset the bounce
454
+
455
+ df$adj[x] <- df$xpos[x]
456
+
457
+ df$v0[x] <- df$v0[x] * df$decay[x]
458
+
459
+ df$t[x] <- -time_lapse
460
+
461
+ }
462
+
463
+ }
464
+
465
+ # if stuck, settle it.
466
+
467
+ df$v0 <- ifelse(df$v0 < 0.01, 0, df$v0)
468
+
469
+ df$t <- df$t + time_lapse
470
+
471
+
472
+
473
+ return(df)
474
+
475
+ }
476
+
477
+
478
+
479
+ for(i in 1:5){
480
+
481
+ print(i)
482
+
483
+ df <- df %>% simulate_ball(.,time_lapse = 0.3)
484
+
485
+ generate_picture(df) %>% print()
486
+
487
+ }
488
+
489
+
490
+
491
+ av::av_capture_graphics(expr = {
492
+
493
+ df <- reset_df()
494
+
495
+ for(i in 1:280){
496
+
497
+ print(i)
498
+
499
+ df <- df %>% simulate_ball(.,time_lapse = 0.3)
500
+
501
+ generate_picture(df) %>% print()
502
+
503
+ }
504
+
505
+ }, output = "test2.gif", framerate = 40)
506
+
507
+ ```
508
+
509
+ このようにしたらできますが・・・あとはボールをアルファベットに変え、
510
+
511
+ ボール数を増やし、かつ背景をつけたいが・・・。

1

gifでしたー。

2021/12/24 17:19

投稿

amunagan
amunagan

スコア22

test CHANGED
@@ -1 +1 @@
1
- Rで、png動画を作りたい、画像を作成せずにプログラム内で、アルファベットを動かす。
1
+ Rで、gif動画を作りたい、画像を作成せずにプログラム内で、アルファベットを動かす。
test CHANGED
File without changes