Анимация сети в R - PullRequest
       46

Анимация сети в R

2 голосов
/ 12 июня 2019

Кто-нибудь знает способ визуализации сети (из igraph) по мере ее развития (т. Е. Устанавливаются новые подключения)? Я посмотрел на https://www.r -graph-gallery.com / network / и искал в Интернете, но ничего не видел.

Например, если сеть:

library("tidyverse")
library("igraph")

net.bg <- sample_pa(20) 
V(net.bg)$size <- 8
V(net.bg)$label <- "" 
E(net.bg)$arrow.mode <- 0

net.bg.df <- igraph::as_data_frame(net.bg) 

net.bg.df <- net.bg.df %>%
  mutate(time_frame = 1:n())

l <- layout_randomly(net.bg)

plot(net.bg, layout=l)

Есть ли способ перехода анимации по полю time_frame, аналогичный обычной анимации сюжета, такой как:

library(ggplot2)
library(gganimate)
library(gapminder)
theme_set(theme_bw())

p <- ggplot(
  gapminder, 
  aes(x = gdpPercap, y=lifeExp, size = pop, colour = country)
) +
  geom_point(show.legend = FALSE, alpha = 0.7) +
  scale_color_viridis_d() +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  labs(x = "GDP per capita", y = "Life expectancy")

p + transition_time(year) +
  labs(title = "Year: {frame_time}")

1 Ответ

1 голос
/ 12 июня 2019

Вы можете использовать пакет ggraph , который также можно использовать вместе с gganimate и хорошо обрабатывать igraph объекты.

Чтобы это работало, нам нужно указать моменты времени, в которые должны быть активны ребра.Это не очень элегантно сделано путем создания списка начального времени и конечных точек (который представляет собой число строк в исходном наборе данных).

library(tidyr)
library(ggraph)
library(gganimate)
df0 <- net.bg.df
df0$time_frame <- as.numeric(df0$time_frame)
for(i in 1:nrow(df0)){
  df0$time_frame[i] <- list(df0$time_frame[i][[1]]:19)
}
df <- unnest(df0, time_frame)
g2 <- graph_from_data_frame(df)

l <- as.data.frame(l)  # ggraph only accepts data.frame
colnames(l) <- c("x", "y") # ggraph needs these column names
ggraph(g2, layout = "manual", node.position = l) +
  geom_node_point(color = "blue", size =3) +
  geom_edge_link0(show.legend = F, width = 1) +
  theme_classic() +
  theme(axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) +
  transition_states(time_frame) +
  ggtitle(paste0("time point: ", "{closest_state}"))




А остальное строит график сети и использует transition_states - функцию.Вот дополнительные источники .

appearing edges

...