首页 > 解决方案 > 使用 gganimate 在 R 中创建流动的桑基图的问题

问题描述

我正在使用以下指南来尝试创建流动的桑基图:https ://www.hvitfeldt.me/blog/recreate-sankey-flow-chart/#r-packages 。我的理解是这种方法(即 gganimate(p))利用了一个旧的、现在不受支持的 gganimate 版本。我正在尝试调整代码以使用新的 gganimate。我正在使用下面提供的代码。

我期望得到像博客上那样的结果: 在此处输入图像描述

即缓慢移动并带有单独的点。我的代码得到的是快速移动的“点”,每个点实际上由一系列五个点表示:

在此处输入图像描述

任何使用新 gganimate 复制博客产品的帮助将不胜感激。

代码:

library(tidyverse)
library(gganimate)

sigmoid <- function(x_from, x_to, y_from, y_to, scale = 5, n = 100) {
  x <- seq(-scale, scale, length = n)
  y <- exp(x) / (exp(x) + 1)
  tibble(x = (x + scale) / (scale * 2) * (x_to - x_from) + x_from,
         y = y * (y_to - y_from) + y_from)
}

n_points <- 400
data <- tibble(from = rep(4, n_points),
               to = sample(1:4, n_points, TRUE),
               color = sample(c("A", "B"), n_points, TRUE)) 

p <- map_df(seq_len(nrow(data)), 
            ~ sigmoid(0, 1, as.numeric(data[.x, 1]), as.numeric(data[.x,                     
 2])) %>%
          mutate(time = row_number() + .x,
                 y = y + runif(1, -0.25, 0.25))) %>%
  ggplot(aes(x, y, frame = time)) +
    geom_point()+transition_time(time) 

p

标签: ranimationggplot2sankey-diagramgganimate

解决方案


看起来您有 499 个值time,比渲染的默认帧数 (100) 多。当您使用transition_time(time)它时,它包括所有数据,即使对于“介于”渲染的帧之间的帧也是如此。这就是为什么您会看到由 5 个点组成的组。

您可以:

1) 替换为transition_manual(time)只使用 100 帧数据,丢弃介于两者之间的数据,或者

2) 保留transition_time(time)但使用 渲染animate(p, nframes = 499),以便保留所有帧。

在此处输入图像描述


推荐阅读