Сюжет Hexbin с анимацией - PullRequest
0 голосов
/ 04 июля 2018

Я хотел бы создать анимацию для шестнадцатеричного графика со скользящей шкалой для года, чтобы он отображал новый шестнадцатеричный график для каждого года.

В настоящее время я использую ggplot2 и plotly для анимации и могу создать это для geom_point, но похоже, что geom_hex не поддерживается plotly и ничего не отображается в граф.

library(plotly)
library(ggplot2)
library(gapminder)

p1 <- ggplot(gapminder) +
geom_point(aes(y = lifeExp, x = gdpPercap, frame = year))

ggplotly(p1)

p2 <- ggplot(gapminder) +
geom_hex(aes(y = lifeExp, x = gdpPercap, frame = year))

ggplotly(p2)

Результат, который я получу, будет эквивалентен графикам, полученным с помощью facet_wrap(~year), но вместо анимации.

ggplot(gapminder) +
geom_hex(aes(y = lifeExp, x = gdpPercap)) + facet_grid(~year)

Я также смотрел на gganimate, но имел проблемы с установкой, предпочел бы скользящую шкалу, которую имеет plotly. Поиск Google, чтобы попытаться найти анимацию шестнадцатеричного сюжета, оказался бесплодным. Есть ли в R какие-либо другие пакеты для рисования или анимации, которые я могу использовать для достижения этого или способ, которым я могу взломать ggplot и plotly, чтобы сделать то, что я хочу?

Код о том, как это сделать, будет принята с благодарностью.

1 Ответ

0 голосов
/ 05 июля 2018

Код для ggplotly показывает, что отправка осуществляется посредством класса hte класса значения last_plot():

ggplotly
 #---------
function (p = ggplot2::last_plot(), width = NULL, height = NULL, 
    tooltip = "all", dynamicTicks = FALSE, layerData = 1, originalData = TRUE, 
    source = "A", ...) 
{
    UseMethod("ggplotly", p)
}
<bytecode: 0x7feba7ef5ff0>
<environment: namespace:plotly>

Итак, как вы и подозревали, похоже, что нет «следа» для использования терминологии plotly, связанной с элементом класса: Class GeomHex, Geom, gg. Однако существует метод, связанный со значениями класса GeomPath, поэтому вы можете использовать geon_density2d для анимации 2d-плотности с этими данными. Он выглядит немного запутанным во время анимации, но общий шаблон данных кажется мне очевидным:

library(plotly)
library(ggplot2)
library(gapminder)

p2 <- ggplot(gapminder) +
geom_density2d(aes(y = lifeExp, x = gdpPercap, frame=year))

ggplotly(p2)

От ggplot есть предупреждение о том, что кадр не используется, но необходимо сохранить аргумент frame в вызове aes(.), чтобы сигнализировать ggploty, что анимация желательна.

Также есть bin2d для анимации отображений интервального типа:

p3 <- ggplot(gapminder) +
geom_bin2d(aes(y = lifeExp, x = gdpPercap, frame=year))

ggplotly(p3)
...