Добавить градиенты и нарисованные от руки эффекты в gganimate сюжет - PullRequest
1 голос
/ 15 октября 2019

Меня интересует использование gganimate с градиентами и рисованными эффектами заливки и рисования (см. Отрывочные и раскрашенные здесь градиенты: https://semiotic.nteract.io/guides/sketchy-painty-patterns). Возможно ли это? Я обнаружил, что ggrough (https://xvrdm.github.io/ggrough/) способен преобразовывать ggplot2 объекты для получения таких эффектов. Однако можно ли использовать ggrough или какую-либо другую вещь в сочетании с gganimate?

Иесть другой способ сделать это, даже в базе ggplot2 (то есть, не используя gganimate?). Обратите внимание, что я боюсь, что ответ на оба вопроса - нет, особенно с градиентной заливкой (см. ответ @hadley Hadley Wickhams на этот вопрос: Как добавить текстуру для заливки цветов в ggplot2 ).

Или есть другое решение, которое все еще использует ggplot2, но не gganimate? Я полагаю, что если бы это было возможно в базеggplot2 что я мог бы сделать много отдельных файлов и сшить их вместе, чтобы сделать .gif. Хотя теоретически я мог бы сделать это, используя вывод ggrough.

1 Ответ

2 голосов
/ 24 октября 2019

Другим вариантом может быть использование библиотеки xkcd для получения волнистых линий. Это не делает волнистые заливки, но это начало и находится в правильном эстетическом соседстве. Я не смог заставить его работать "из коробки" с gganimate, но можно подготовить ваши данные с помощью tweenr (тот же пакет, на котором полагается gganimate) и передать их в gganimate::transition_manual до достойного эффекта:

enter image description here

Вот как. Учитывая эти поддельные данные:

library(tidyverse); library(gganimate)
df <- tibble(Group = rep(1:3, times = 3),
             value = c(1:6, 3:1),
             period = rep(1:3, each = 3))

Мы могли бы анимировать с помощью geom_rect и gganimate::transition_states. geom_col было бы проще, но я хочу показать сходство с xkcd::xkcdrect позже.

ggplot() +
  geom_rect(data = df,
           aes(xmin = Group - 0.4, xmax = Group + 0.4,
               ymin = 0, ymax = value), 
           fill = "gray80") +
  transition_states(period)

enter image description here

Я получаю ошибку, когда япадение в xkcd::xkcdrect эквиваленте:

# Doesn't work
ggplot() +
  xkcd::xkcdrect(aes(xmin = Group - 0.4, xmax = Group + 0.4,
                     ymin = 0, ymax = value), fill = "gray80",
                 df) +
  transition_states(period)

Ошибка в if (nrow (from) == 0 && nrow (to) == 0) {: отсутствует значение, где требуется TRUE / FALSE Вдополнение: Предупреждающие сообщения: 1: В rep («raw», length = nrow (from)): первый элемент, использованный в аргументе «length.out» 2: In rep («raw», length = nrow (to)): firstэлемент, используемый в аргументе length.out 3: В rep (NA_integer_, length = nrow (to)):
первый элемент, использованный в аргументе length.out

Но мы можем получитьв то же самое место, предварительно подготовив предварительно обработанные данные, а затем передайте их в transition_manual:

df_tween <- tweenr::tween_states(
  list(df[1:3,],
       df[4:6,],
       df[7:9,],
       df[1:3,]), 3, 1, 'cubic-in-out', 100)


  ggplot() +
  xkcd::xkcdrect(aes(xmin = Group - 0.4, xmax = Group + 0.4,
                     ymin = 0, ymax = value), fill = "gray80",
                 df_tween) +
  transition_manual(.frame)
...