рекомендации

вторник, 18 февраля 2020 г.

Создание анимированных изображений для визуализации данных в R с помощью gganimate

Перевод. Оригинал: How to create animated images for data visualization

Введение

Визуализация данных, вероятно, является наиболее важной и обычно наименее обсуждаемой областью науки о данных.

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

Одной из проблем в создании эффективных визуализаций является создание изображений, которые говорят сами за себя. Эта статья покажет один из способов сделать это с помощью анимированных изображений GIF (Graphics Interchangeable format). Это будет особенно полезно, если вы хотите показать истории, основанные на времени/потоке. Используя анимацию в изображениях, вы можете построить изменение данных с течением времени для определенного набора параметров. Другими словами, легко понять и увидеть рост определенного параметра с течением времени.

Позвольте мне показать это на примере.

Пример - ВВП и ожидаемая продолжительность жизни

Допустим, вы хотите показать, как ВВП и ожидаемая продолжительность жизни менялись для разных континентов/стран с течением времени. Как вы думаете, какой лучший способ представить эти отношения?

Вы можете думать о нескольких вариантах, например:

     Создание трехмерного графика с ВВП, ожидаемой продолжительностью жизни и временем на 3 осях и построить линии для каждого континента/страны. Проблема в том, что человеческий глаз действительно плох в интерпретации 3D визуализаций в 2D. Особенно, если данных слишком много. Таким образом, этот вариант не будет работать.
     Создание двух графиков рядом - один показывает ВВП с течением времени, а другой ожидаемую продолжительность жизни с течением времени. Хотя это двухмерный график, мы многое оставили для интерпретации пользователем. Человек должен выбрать страну и увидеть ее прогресс на каждом участке, а затем соотнести их. Опять же, я бы спросил об этом у заинтересованных сторон.

Теперь давайте посмотрим на это с помощью анимированного графика с использованием файла .gif:



Недавняя разработка пакета gganimate сделала это возможным и простым. К концу этой статьи вы сможете создать свой собственный файл .gif и создать собственный настраиваемый фрейм для сравнения различных параметров в глобальном или локальном масштабе.

Предварительные требования

Пожалуйста, установите следующие пакеты:

    ggmap
    gganimate
    dplyr
    animation

В дополнение к вышеперечисленным библиотекам R вам также потребуется программное обеспечение Image Magick в вашей системе. Вы можете скачать и установить его с сайта Image Magick.

Получение данных

Здесь мы пытаемся сделать файл .gif по данным о землетрясениях за 1965-2016 гг. Лучше составлять график глобальной сейсмической активности с учетом года, а не статически отображать все значения на карте. Набор данных для землетрясений доступен на Kaggle.
Набор данных содержит данные для глобальной сейсмической активности с 1965 по 2016 год. Пожалуйста, перейдите по ссылке выше и прокрутите вниз, чтобы получить файл .csv.

Землетрясения силой 7 баллов по шкале Рихтера с 1965-2016 гг.

Набор данных был изменен, и для исследования рассматривалась только сейсмическая ценность в 7 баллов по шкале Рихтера.

Манипуляции данными

Из файла .csv для простоты мы выбрали только несколько параметров.

Дата
Время
Широта
Долгота
Тип - тип сейсмической активности
Глубина - это глубина эпицентра от уровня моря.
Величина - это значение по шкале Рихтера
ID - это идентификатор события сейсмической активности

Мы готовы начать кодирование в R. Я использовал среду RStudio. Вы можете свободно использовать любую среду, которую вы предпочитаете.

## Читаем набор данных и загружаем необходимые пакеты
library(plyr)
library(dplyr)
library(ggmap)
library(ggplot2)
library(gganimate)
EQ=read.csv("eq.csv",stringsAsFactors = FALSE)
names(EQ)
## Выбираем данные только с магнитудой 7 или больше.
EQ=EQ%>%filter(Magnitude>=7)
Разделяем дату на год, месяц и день

Это делается для того, чтобы получить кадр, который важен для сюжета. Другими словами, ядром подхода является обработка кадра (например, момент времени в анимации) как другого измерения, например x, y, размер, цвет и т. д. Таким образом, переменная в ваших данных может быть сопоставлена с фреймом так же, как другие переменные сопоставлены с x или y.


## Преобразуем даты в символ, чтобы разделить столбец на столбцы "dd" "mm" "yy"" 
EQ$Date=as.character(EQ$Date)

## Разделяем дату и создаем из нее список

list=strsplit(EQ$Date,"-")

## Конвертируем список в dataframe
library(plyr)
EQ_Date1=ldply(list)
colnames(EQ_Date1)=c("Day","Month","Year")

## Объединяем столбец с dataframe
EQ=cbind(EQ,EQ_Date1)
names(EQ)
## Меняем тип Date на numeric
EQ$Year=as.numeric(EQ$Year)

## Получаем карту мира для графика и загружаем необходимый пакет
library(ggmap)
world=map_data("world")

## Удаляем с карты мира регион Antarctica

world = world[world$region != "Antarctica",]
map=ggplot()+geom_map(data=world,map=world,aes(x=long,y=lat,map_id=region),color='#333300',fill='#663300')

# строим точки на карте мира

p = map + geom_point(data = EQ, aes(x = Longitude, y = Latitude, 
                                             frame = Year, 
                                            cumulative = TRUE,size=EQ$Magnitude), alpha = 0.3, 
                      size = 2.5,color="#336600")+
  geom_jitter(width = 0.1) +labs(title = "Earthquake above 7 point on richter scale")+theme_void()

# создаем файл .gif file с использованием функции gganimate

gganimate(p)


Ускорение анимации в .gif с помощью пакета animation

Как мы видим, у этого графика слишком много лет, с 1965 по 2016 год. Таким образом, чтобы ускорить визуализацию, мы можем использовать пакет animation для быстрой перемотки вперед с помощью ani.option().

library(animation)
ani.options(interval=0.15)
gganimate(p)


Комментариев нет:

Отправить комментарий