вставить изображение в ggplot + gganimate, когда ось x является датой - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу анимировать некоторые данные, используя gganimate.Взяв пример со страницы github, я немного изменил его, чтобы отразить мой случай.Ось X - это даты, и я хочу, чтобы логотип находился в одной и той же позиции для всех кадров.

Воспроизводимый код:

library(magick)
library(gapminder)
library(ggplot2)
library(rsvg)
library(gganimate)

tiger <- image_read_svg('http://jeroen.github.io/images/tiger.svg', width = 400)

(p <- ggplot(gapminder, aes(year, lifeExp, size = pop, colour = country)) +
  geom_point(alpha = 0.7, show.legend = FALSE) +
  scale_colour_manual(values = country_colors) +
  scale_size(range = c(2, 12)) +
  scale_x_log10() +
  annotation_raster(tiger, ymin = 75, ymax = 100, xmin = 1965, xmax = 2005) )

# here the animate part (not needed just for ilustrative purposes)

p + labs(title = 'Year: {frame_time}', x = 'Year', y = 'life expectancy') +
  transition_time(year) +
  ease_aes('linear')

Проблема в том, что я могу нанести логотип на любой график, когда x-оси не являются датами.

Я подозреваю, что эта проблема связана с типом даты, но пока безуспешно.

1 Ответ

0 голосов
/ 30 ноября 2018

Ваша проблема связана с масштабом журнала, который вы вызываете для своей оси X.Он берет ваш годовой вектор - который является не датой, а 4-значным целым числом - и применяет к нему преобразование журнала ... что, как указал @camille, означает, что когда вы вызываете animation_raster координаты (xmin /xmax) находятся вне графика.

Вот решение, которое включает даты, меняя год в вашем фрейме данных на формат даты.Это также накладывает изображение позади geoms и отрисовывает в его оригинальном масштабе, т.е.1x1.

library(magick) 
library(gapminder)
library(ggplot2)
library(rsvg)
library(gganimate)
library(lubridate)

tiger <- image_read_svg('http://jeroen.github.io/images/tiger.svg', width = 
400)

xmin <- ymd("1965/01/01")
xmax <- ymd("2005/01/01")
ymin <- 30
height <- round(as.numeric(xmax-xmin)/356, 0)
ymax <- ymin + height

gapminder %>%
    mutate(year = ymd(year, truncated = 2L)) %>%
    ggplot() +
    aes(year, lifeExp, size = pop, colour = country) +
    annotation_raster(tiger, ymin = ymin, ymax = ymax, xmin = xmin, xmax = 
    xmax) +
    geom_point(alpha = 0.7, show.legend = FALSE) +
    scale_colour_manual(values = country_colors) +
    scale_size(range = c(2, 12)) +
    labs(title = 'Year: {frame_time}', x = 'Year', y = 'life expectancy') +
    transition_time(year) +
    ease_aes('linear') +
    anim_save("animated_tiger_timeseries.gif")

Кто производит это ...

enter image description here

Это то, что вы ищете?

...