Я сделал следующие 3 графика в R:

#create data
a = abs(rnorm(100,10,10))
b = abs(rnorm(100,10,10))
i = 1
c = data.frame(a,b,i)
c$col = as.factor(ifelse(c$b>10,"red", "blue"))

a = abs(rnorm(100,10,10))
b = abs(rnorm(100,10,10))
i = 2
d = data.frame(a,b,i)
d$col = as.factor(ifelse(d$a>10,"red", "blue"))

a = abs(rnorm(100,10,10))
b = abs(rnorm(100,10,10))
i = 3
e = data.frame(a,b,i)
e$col = as.factor(ifelse(e$b>10,"red", "blue"))

   #put all the datasets together (i=1, i=2, i=3)
g = rbind(c,d,e)

 #plot
plot_1 = plot(c$a, type = "h", col = c$col, main = "plot_1, i = 1")
plot_2 = plot(d$a, type = "h", col = d$col, main = "plot_2, i = 2")
plot_3 = plot(e$a, type = "h", col = e$col, main = "plot_3, i = 3")

enter image description here

Я пытаюсь сделать "анимацию" этих графиков: plot_1 -> plot_2 -> plot_3

Мне удалось сделать нечто подобное с помощью ggplot2 / gganimate:

library(ggplot2)
library(gganimate)

animate(
  ggplot(g, aes(x=a)) + 
  geom_histogram(binwidth=1) +
  transition_states(i, state_length = 0.2) +
  labs(title = "Group: {closest_state}"),
  fps = 25)

enter image description here

Но я специально пытаюсь сделать это, используя графики, созданные с базовым R. Это потому, что я считаю схему окраски более эффективной, я не могу так четко показать разные цвета в версии ggplot, как я могу с базовым R версия.

enter image description here

Кто-нибудь может показать мне, как «оживить / прикрепить» эти 3 графика вместе?

enter image description here

Благодарность!

1
Noob 9 Окт 2021 в 20:52

2 ответа

Лучший ответ

Мы можем попробовать анимацию gifski на странице уценки

---
title: "Title"
output: html_document

---

```{r setup, include=FALSE}
 knitr::opts_chunk$set(echo = TRUE)
 ```

## R Markdown

 ```{r data, echo = FALSE}
suppressPackageStartupMessages(library(gifski))
a = abs(rnorm(100,10,10))
b = abs(rnorm(100,10,10))
i = 1
c = data.frame(a,b,i)
c$col = as.factor(ifelse(c$b>10,"red", "blue"))

a = abs(rnorm(100,10,10))
b = abs(rnorm(100,10,10))
i = 2
d = data.frame(a,b,i)
d$col = as.factor(ifelse(d$a>10,"red", "blue"))

 a = abs(rnorm(100,10,10))
 b = abs(rnorm(100,10,10))
 i = 3
 e = data.frame(a,b,i)
 e$col = as.factor(ifelse(e$b>10,"red", "blue"))

#put all the datasets together (i=1, i=2, i=3)
g = rbind(c,d,e)

 lst1 <- list(c, d, e)

 ```


 ```{r, animation.hook="gifski"}
 for (i in seq_along(lst1)) {
  plot(lst1[[i]]$a, type = 'h', col = lst1[[i]]$col,
      main = paste0("plot_", i))
  }
 ```

Или если мы просто хотим сохранить файл как gif

library(gifski)
lst1 <- list(c, d, e)
gif_file <- "/path/to/file.gif")
save_gif(
for (i in seq_along(lst1)) {
  plot(lst1[[i]]$a, type = 'h', col = lst1[[i]]$col, main = paste0("plot_", i))
}, gif_file, 1280, 720, res = 144)
2
akrun 9 Окт 2021 в 18:58

Вы ищете такое решение?

Мы могли бы использовать par()

С помощью функции par() мы могли бы включить опцию mfrow=c(nrows, ncols) для создания матрицы графиков nrows x ncols, которые заполняются по строкам.

mfcol=c(nrows, ncols) заполняет матрицу по столбцам.

par(mar = rep(2, 4))
par(mfrow =c(2,3))
plot_1 = plot(c$a, type = "h", col = c$col, main = "plot_1, i = 1")
plot_2 = plot(d$a, type = "h", col = d$col, main = "plot_2, i = 2")
plot_3 = plot(e$a, type = "h", col = e$col, main = "plot_3, i = 3")

enter image description here

2
TarJae 9 Окт 2021 в 18:16