Site icon R-bloggers

Pi Day Circles

[This article was first published on R on kieranhealy.org, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Some Lissajous animations for Pi Day. Made with R, ggplot, and gganimate.

< video autoplay loop muted playsinline controls="true" width = "100%"> < source src="./lissajous-fixed-lg-2.mp4" type="video/mp4"> < source src="./lissajous-fixed-lg-2.mov" type="video/mov"> < source src="./lissajous-fixed-lg-2.webm" type="video/webm">

And the really not very efficient code that made them:

r
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
library(tidyverse)
library(gganimate)
library(transformr)

df_base <- tibble(
  id = seq(1, 1000, 1),
  t_vals = seq(0, 2 * pi, length.out = 1000))


circles <- function(t) {
  x01 <- cos(t * 1)
  y01 <- sin(t * 1)

  x02 <- cos(t * 2)
  y02 <- sin(t * 2)

  x03 <- cos(t * 3)
  y03 <- sin(t * 3)

  x04 <- cos(t * 4)
  y04 <- sin(t * 4)

  x05 <- cos(t * 5)
  y05 <- sin(t * 5)

  x06 <- cos(t * 6)
  y06 <- sin(t * 6)

  x07 <- cos(t * 7)
  y07 <- sin(t * 7)

  x08 <- cos(t * 8)
  y08 <- sin(t * 8)

  x09 <- cos(t * 9)
  y09 <- sin(t * 9)

  x10 <- cos(t * 10)
  y10 <- sin(t * 10)


  tibble(
    tick = seq_along(t),
    x01, x02, x03, x04, x05, x06, x07, x08, x09, x10,
    y01, y02, y03, y04, y05, y06, y07, y08, y09, y10
    )
}

df_out <- circles(t = df_base$t_vals)

df <- bind_cols(df_base, df_out) |>
  select(id, tick, everything()) |>
  pivot_longer(x01:x10, names_to = "x_group", values_to = "x") |>
  pivot_longer(y01:y10, names_to = "y_group", values_to = "y") |>
  mutate(x_group = str_remove(x_group, "x"),
         y_group = str_remove(y_group, "y")) |>
  unite("group_id", x_group, y_group, remove = FALSE)

out <- df |>
  ggplot(aes(x = x, y = y, color = group_id, group = group_id)) +
  geom_point(size = 3) +
  geom_path() +
  facet_grid(x_group ~ y_group) +
  coord_equal() +
  guides(color = "none") +
  theme_void() +
  transition_reveal(tick) +
  ease_aes("linear")



animate(out, duration = 30, fps = 24, height = 1080, width = 1080,
        renderer = ffmpeg_renderer())

anim_save(filename = "lissajous-fixed-lg-2.webm",
          height = 1080, width = 1080)
To leave a comment for the author, please follow the link and comment on their blog: R on kieranhealy.org.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Exit mobile version